Python入门第9课 - 切片

前面讲到了如何访问列表的单个元素以及处理整个列表,接下来讲如何处理列表的部分元素,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[:]

print("我最爱吃的食物:")

print(my_foods)

print(" 我的好朋友爱吃的食物:")

print(friend_foods)

第②行 从列表my_foods中提取了一个切片,因为没有指定任何索引,从而创建了这个列表的副本,再将这个副本存储到变量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")

print("我最爱吃的食物:")

print(my_foods)

print(" 我的好朋友爱吃的食物:")

print(friend_foods)

第③行 向列表my_foods中添加了"LeShi";

第④行 向列表friend_foods中添加了"cannoli";

打印结果显示,这两种食品的确包含在正确的列表中:

我最爱吃的食物:

['Dove', 'Lindt', 'Meiji','LeShi']

我的好朋友爱吃的食物:

['Dove', 'Lindt', 'Meiji','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)

这里将my_foods赋值给friend_foods,而不是将my_foods的副本存储到friend_foods。这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods的列表,因此这两个变量都指向同一个列表(可以理解为这两个变量都指向了同一个列表的内存地址)。因此,当将"LeShi"添加到my_foods中时,它也会出现在friend_foods中;同样,虽然"cannoli"好像只被添加到了friend_foods中,但它同样也将出现在my_foods中。

输出表明,两个列表是相同的,但这并非是我们想要的结果:

我最爱吃的食物:

['Dove', 'Lindt', 'Meiji','LeShi','cannoli']

我的好朋友爱吃的食物:

['Dove', 'Lindt', 'Meiji','LeShi','cannoli']

7.4 实例练习

实例1:

创建一个列表,用来存储你最想去旅行的10个地方。

使用切片打印列表的前3个元素;

使用切片打印列表的最后3个元素;

使用切片打印中间的3个元素。

实例2:

创建实例1中列表的副本,用来存储你好友最想去的旅行目的地(假设你想去的地方你好友都想去)。

在原来的列表中添加一个新的目的地;

在好友的列表中添加一个新的目的地;

核实你有两个不同的列表,使用for循环分别打印列表,通过输出结果验证确实有两个不同的列表。

如有问题,欢迎在留言区留言,感谢。

欢迎关注公众号:Python公开课,一起创造更有趣的事儿

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335