前面讲到了如何访问列表的单个元素以及处理整个列表,接下来讲如何处理列表的部分元素,Python 中称之为切片.
9.1 切片
要创建切片,可指定要使用的第一个元素和最后一个元素的索引,Python 在到达指定的第二个索引前面的元素后停止.例如,要输出列表中前三个元素,需要指定索引 0-3,这将输出索引分别为 0,1,2 的元素.
numbers.py
① numbers = [1,4,7,2,6]
② print(numbers[0:3])
第②行 的代码将打印列表的一个切片,其中只包含三个元素.输出结果也是一个列表,即切片是列表的子集:
[1,4,7]
利用切片,你可以生成列表的任何子集.例如,想提取列表的第 2-4 个元素,可将起始索引指定为 1,终止索引指定为 4:
① numbers = [1,4,7,2,6]
② print(numbers[1:4])
这一次,切片始于 4,终于 2:
[4,7,2]
如果没有指定第一个索引,默认从列表的开头开始:
① numbers = [1,4,7,2,6]
② print(numbers[:4])
由于没有指定起始索引,默认从索引 0 开始:
[1,4,7,2]
如果没有指定终止索引,默认终止与列表末尾:
① numbers = [1,4,7,2,6]
② print(numbers[1:])
Python 返回从第 2 个元素到列表末尾的所有元素:
[4,7,2,6]
这种语法能够让你输出从特定位置到列表末尾的所有元素,无论列表多长.前面讲过负数索引返回离列表末尾相应距离的元素,因此可以输出列表末尾的任何切片.例如,输出列表的最后三个数字可以使用 numbers[-3:]:
① numbers = [1,4,7,2,6]
② print(numbers[-3:])
上述代码打印从列表倒数第三个元素开始到列表末尾的切片:
[7,2,6]
9.2 遍历切片
如果要遍历列表的部分元素,可在 for 循环中使用切片,例如:
# -*- coding:utf-8 -*-
① numbers = [1,4,7,2,6]
② for number in numbers[:3]:
③ print("您的幸运数字是 %d" % number)
第①行 的代码只遍历了列表的前 3 个数字,没有遍历整个列表:
您的幸运数字是 1
您的幸运数字是 4
您的幸运数字是 7
切片有很多的作用,例如,编写游戏时使用列表保存用户的游戏得分,为了取出用户的 TOP 得分,可以将列表进行降序排列,再创建一个只包含前三个得分的切片.最常见的是使用切片来分页显示信息,一个列表存储 100 个商品,一页显示 10 个,第一页显示 [:10],第二页显示 [10:20].......
9.3 复制列表
要复制列表,可创建一个包含整个列表的切片,方法是同时省略初始和终止索引 [:].
例如,有一个列表,里面存储了你最爱吃的三种巧克力,你有一个好基友 / 好闺蜜,不仅喜欢吃你爱吃的,还喜欢其他的,现在想创建一个列表用来存储好基友 / 好闺蜜最爱吃的:
# -*- coding:utf-8 -*-
① my_foods = ["Dove","Lindt","Meiji"]
② friend_foods = my_foods[:]
第②行 从列表 my_foods 中提取了一个切片,因为没有指定任何索引,从而创建了这个列表的副本,再将这个副本存储到变量 friend_foods 中.打印每个列表,发现结果的确是相同的:
print("我最爱吃的食物:")
print(my_foods)
print("我的好朋友爱吃的食物:")
print(friend_foods)
我最爱吃的食物:
['Dove', 'Lindt', 'Meiji']
我的好朋友爱吃的食物:
['Dove', 'Lindt', 'Meiji']
为核实我们的确得到了两个列表,现在向每个列表中添加一个新食品,并核实每个列表确实都记录了相应人员喜欢的食品:
# -*- coding:utf-8 -*-
① my_foods = ["Dove","Lindt","Meiji"]
② friend_foods = my_foods[:]
③ my_foods.append("LeShi")
④ friend_foods.append("cannoli")
第③行 向列表 my_foods 中添加了 "LeShi";
print("我最爱吃的食物:")
print(my_foods)
print("我的好朋友爱吃的食物:")
print(friend_foods)
第④行 向列表 friend_foods 中添加了 "cannoli";
打印结果显示,这两种食品的确包含在正确的列表中:
我最爱吃的食物:
['Dove', 'Lindt', 'Meiji','LeShi']
我的好朋友爱吃的食物:
['Dove', 'Lindt', 'Meiji','cannoli']
那么,为什么要使用切片的形式进行列表的复制,而不是直接使用 friend_foods = my_foods 呢?因为使用这样的方式得不到两个列表,而是得到同一个列表.下面的例子演示了不使用切片的情况下复制列表的情况:
这里将 my_foods 赋值给 friend_foods,而不是将 my_foods 的副本存储到 friend_foods.这种语法实际上是让 Python 将新变量 friend_foods 关联到包含在 my_foods 的列表,因此这两个变量都指向同一个列表(可以理解为这两个变量都指向了同一个列表的内存地址).因此,当将 "LeShi" 添加到 my_foods 中时,它也会出现在 friend_foods 中;同样,虽然 "cannoli" 好像只被添加到了 friend_foods 中,但它同样也将出现在 my_foods 中.
# -*- coding:utf-8 -*-
my_foods = ["Dove","Lindt","Meiji"]
# 这种方法得到的是同一个列表
friend_foods = my_foods
my_foods.append("LeShi")
friend_foods.append("cannoli")
print("我最爱吃的食物:")
print(my_foods)
print("我的好朋友爱吃的食物:")
print(friend_foods)
输出表明,两个列表是相同的,但这并非是我们想要的结果:
我最爱吃的食物:
['Dove', 'Lindt', 'Meiji','LeShi','cannoli']
我的好朋友爱吃的食物:
['Dove', 'Lindt', 'Meiji','LeShi','cannoli']
7.4 实例练习实例 1:
创建一个列表,用来存储你最想去旅行的 10 个地方.
使用切片打印列表的前 3 个元素;
使用切片打印列表的最后 3 个元素;
使用切片打印中间的 3 个元素.
实例 2:
创建实例 1 中列表的副本,用来存储你好友最想去的旅行目的地(假设你想去的地方你好友都想去).
在原来的列表中添加一个新的目的地;
在好友的列表中添加一个新的目的地;
核实你有两个不同的列表,使用 for 循环分别打印列表,通过输出结果验证确实有两个不同的列表.
如有问题,欢迎在留言区留言,感谢.
来源: http://www.jianshu.com/p/eff531fc0014