python之使用列表的一部分

在python中处理列表的部分元素-------python称之为切片

  1. 要创建切片,可指定要使用的第一个元素的索引和最后一个元素的索引加1,与函数range()一样,python在达到指定的第二个索引前面的元素后停止,要输出列表中的前三个元素,需要指定索引0-3,这将输出分别为0,1,2元素。
    下面举一个运动员的列表例子:

    players.py
    1 players = ['charles', 'martina','michael','florence','eli']
    2 print(players[0:3])
    

    执行结果:

     [email protected]:~/python$ python players.py 
     ['charles', 'martina', 'michael']
    

    当然也可以生成列表的任何子集,例如,如果你要提取列表的第2~4个元素,可将起始索引指定为1,并将终止索引指定为4:

       1 players = ['charles', 'martina','michael','florence','eli']
       3 print(players[1:4])
    

    执行结果:

      [email protected]:~/python$ python players.py 
      ['martina', 'michael', 'florence']
    

    如没有指定第一个索引,python将自动从列表开头开始:

      1 players = ['charles', 'martina','michael','florence','eli']
      4 print(players[:4])
    

执行结果:

	[email protected]:~/python$ python players.py 
	['charles', 'martina', 'michael', 'florence']

当然也可以使用终止于列表尾,使用同样的方法,如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引:

1 players = ['charles', 'martina','michael','florence','eli']
5 print(players[2:])

来看看执行结果:

[email protected]:~/python$ python players.py 
['michael', 'florence', 'eli']

无论列表有多长,该语法都能够让你输出从特定位置到列表末尾的所有元素,之前说过负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片,举例,如果你要输出名单上的最后三名队员,就可以如下方式:

  1 players = ['charles', 'martina','michael','florence','eli']
  6 print(players[-3:])

执行结果:

[email protected]:~/python$ python players.py 
['michael', 'florence', 'eli']

好了,接下来就说说遍历切片,在for循环中使用切片,来举个例子吧:

1 players = ['charles', 'martina','michael','florence','eli']
7 print("here are the first three players on my team: ")
8 for player in players[:3]:
9         print(player.title())

执行结果:

	[email protected]:~/python$ python players.py 
	here are the first three players on my team: 
	Charles
	Martina
	Michael

切片的使用还是很大的,例如,在编写游戏时,可以在玩家退出游戏时将其最终得分加入到一个列表中,然后,为获取该玩家的三个最高得分,你可以将该列表按降序排列,再创建一个只包含前三个得分的切片,处理数据时,可使用切片来进行批量处理;编写Web应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息。

复制列表
经常需要根据既有列表创建全新的列表,下面就说说复制列表的工作原理,以及复制列表可提供极大的帮助的一种情形。
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。这让python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
下面举个食物的例子,假设一个列表中包含你最喜欢的三种食品,而你还想创建另一个列表,在其中包含一位朋友喜欢的所有食品,不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来创建新的列表:

	foods.py
	  1 my_foods = ['pizza','falafel','carrot cake']
	 2 friend_foods = my_foods[:]
	3 print("My favorite foods are: ")
	4 print(my_foods)
	5 
	6 print("\nMy friend's favorite foods are: ")
	7 print(friend_foods)

看看执行结果:

[email protected]:~/python$ python foods.py 
My favorite foods are: 
['pizza', 'falafel', 'carrot cake']

My friend's favorite foods are: 
['pizza', 'falafel', 'carrot cake']

为了核实确实有两个列表,下面再每个列表中都添加一种食品,并核实每个列表都记录了相应人员喜欢的食品:

   1 my_foods = ['pizza','falafel','carrot cake']
   2 friend_foods = my_foods[:]
   3 my_foods.append('cannoli')
   4 friend_foods.append('ice cream')
   5 
   6 print("My favorite foods are: ")
   7 print(my_foods)
   8 
   9 print("\nMy friend's favorite foods are: ")
  10 print(friend_foods)

执行结果呢?

[email protected]:~/python$ python foods.py 
My favorite foods are: 
['pizza', 'falafel', 'carrot cake', 'cannoli']

My friend's favorite foods are: 
['pizza', 'falafel', 'carrot cake', 'ice cream']

结果已经很明显了,尚若我们只有简单地将my_foods赋给friends_foods,就不能得到两个列表,例如,下例演示了再不使用切片的情况下复制列表的情况:

	  1 my_foods = ['pizza','falafel','carrot cake']
	 #这是行不通的
	  2 friend_foods =  my_foods    #my_foods[:]
	  3 my_foods.append('cannoli')
 	  4 friend_foods.append('ice cream')
      5 
      6 print("My favorite foods are: ")
      7 print(my_foods)
      8 
      9 print("\nMy friend's favorite foods are: ")
     10 print(friend_foods)

拭目以待,来看看结果吧:

	[email protected]:~/python$ python foods.py 
	My favorite foods are: 
	['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

	My friend's favorite foods are: 
	['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

看到了吧,这里是将my_foods赋给friend_foods,而不是将my_foods的副本存储到friend_foods,这种语法实际上是让python将新变量friends_foods关联到包含my_foods中的列表,因此这两个变量都指向同一个列表。鉴于此,当我们将‘cannoli’ 添加到my_foods中时,它也将出现再friend_foods中;同样,虽然’ice cream’ 好像只被加入到了friend_foods中,但它也将出现在这两个列表中。输出表明,两个列表是相同的,这并非是我们想要的结果

发布了53 篇原创文章 · 获赞 16 · 访问量 2213

猜你喜欢

转载自blog.csdn.net/m0_37757533/article/details/105155521