在python中处理列表的部分元素-------python称之为切片
-
要创建切片,可指定要使用的第一个元素的索引和最后一个元素的索引加1,与函数range()一样,python在达到指定的第二个索引前面的元素后停止,要输出列表中的前三个元素,需要指定索引0-3,这将输出分别为0,1,2元素。
下面举一个运动员的列表例子:players.py 1 players = ['charles', 'martina','michael','florence','eli'] 2 print(players[0:3])
执行结果:
book@www.100ask.org:~/python$ python players.py ['charles', 'martina', 'michael']
当然也可以生成列表的任何子集,例如,如果你要提取列表的第2~4个元素,可将起始索引指定为1,并将终止索引指定为4:
1 players = ['charles', 'martina','michael','florence','eli'] 3 print(players[1:4])
执行结果:
book@www.100ask.org:~/python$ python players.py ['martina', 'michael', 'florence']
如没有指定第一个索引,python将自动从列表开头开始:
1 players = ['charles', 'martina','michael','florence','eli'] 4 print(players[:4])
执行结果:
book@www.100ask.org:~/python$ python players.py
['charles', 'martina', 'michael', 'florence']
当然也可以使用终止于列表尾,使用同样的方法,如果要提取从第3个元素到列表末尾的所有元素,可将起始索引指定为2,并省略终止索引:
1 players = ['charles', 'martina','michael','florence','eli']
5 print(players[2:])
来看看执行结果:
book@www.100ask.org:~/python$ python players.py
['michael', 'florence', 'eli']
无论列表有多长,该语法都能够让你输出从特定位置到列表末尾的所有元素,之前说过负数索引返回离列表末尾相应距离的元素,因此你可以输出列表末尾的任何切片,举例,如果你要输出名单上的最后三名队员,就可以如下方式:
1 players = ['charles', 'martina','michael','florence','eli']
6 print(players[-3:])
执行结果:
book@www.100ask.org:~/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())
执行结果:
book@www.100ask.org:~/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)
看看执行结果:
book@www.100ask.org:~/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)
执行结果呢?
book@www.100ask.org:~/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)
拭目以待,来看看结果吧:
book@www.100ask.org:~/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中,但它也将出现在这两个列表中。输出表明,两个列表是相同的,这并非是我们想要的结果