跟我读python3文档:021_列表推导式(5.1.3. List Comprehensions)

贯穿始终的理念:别废话,就是干!


往期回顾

  • 默认参数
  • 关键字参数
  • 匿名函数lambda
  • 列表的方法
  • del关键字

文档解读

python3文档第五小节链接地址:5. Data Structures

本章主要讲解5.1.3. List Comprehensions(列表推导式)5.1.4. Nested List Comprehensions(嵌套的列表推导式)这两个小节


5.1.3. List Comprehensions(列表推导式)

段落截取(一)

List comprehensions provide a concise way to create lists.

名词解释

  1. List comprehensions
    中文翻译:列表推导式
    这就是我们今天的主角,先记住这个名词,我们稍后具体讲解。

  2. concise
    中文翻译:简洁
    这个词是python语言的中心思想。在以后的学习中,要好好体会,好好思考。

段落大意

列表推导式提供了一种简洁的方式来创造列表。

注意:列表推导式的最终目的是生成列表!


接下来,我们直接看例子来学习列表推导式。

例子:

假设,我们要创建一个像这样的列表[0, 1, 4, 9, 16, 25, 36, 49, 64, 81],我们暂且称为平方数列表。你要如何做?

你可以选择的最直白的方式,就是在你的python交互环境中直接输入上面的列表,对不对?
但是,如果这个列表的数据更多呢?比如有100个,你要怎么办?

当数据量足够大时,就能体现出编程的重要性了。你可以写一个程序,然后输出这样一个列表。

先试试自己能不能写出这样一个程序~

提示:

  • for语句
  • append( )方法

答案:

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

如果你成功实现了,恭喜你,说明你的自学能力很棒。如果没有实现,建议停下来,复习复习之前的章节。

那么如果用列表推导式如何实现呢?

>>> squares = [x**2 for x in range(10)]

对比一下,然后体会体会concise(简洁)这个词~

下面,我们来分析列表推导式的结构。

结构分析:

  1. 方括号
    既然叫列表推导式,自然少不了代表列表特色的方括号了。
  2. 表达式
    在这个例子里是x**2
  3. for循环
  • for 关键字
  • in 关键字

其实for循环后面还可以跟一些if语句用作条件判断,等碰到的时候在讲~

看明白了吗?
变量x从for循环中取值,然后在表达式中运算,运算结果直接存入列表。
过程就和我们最开始写的那个函数是一样的。
也就是说,列表推导式只是一种简写形式。
明白了吗?

注意:变量x仍旧存在于内存中。你可以用print( )函数打印它。
试试自己输出一个包含100个值的平方数列表~


如果觉得自己到目前为止都学会了,那么准备好,我们要加速了。
下面的内容会有一点难度,看不懂的话。。也得看!
还是那句老话,别废话,就是干!

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

能看的懂吗?看不懂没关系,先跟着我往下看。
此列表推导式的表达式有两个变量,x、y。
分别用两个for循环求得对应值,
并且通过if判断语句去除了x、y相等的情况。
注意:两个for循环是嵌套关系。

此列表推导式相当于下面的代码:

>>> a = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             a.append((x, y))
...
>>> a
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

注意两个for语句、一个if语句,他们三个的嵌套关系。或者说是运算顺序。

思考:

>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

提示:(0,0)这种用圆括号括起来的形式叫做元组,他和列表的区别除了形式上括号的区别以外,还有最本质的一点:元组不可更改

此列表推导式的运算顺序可以概括为:取值,运算、运算。
能想明白运行结果吗?

>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

此列表推导式的运算顺序可以概括为:取值,分解。
至于是从谁那里取值,从谁那里分级,分解之后又传递给了谁,则要自己思考了。
注意区分谁是表达式,谁是for循环。

如果看不明白,试试用复杂的嵌套语句的方式实现,在看看运算顺序。

如果你能想明白以上几个列表推导式的运算过程,那么,继续坐稳了,我们要上高速了!
如果不能看懂,建议今天先休息一下,明天在继续。


5.1.4. Nested List Comprehensions

段落截取(二)

The initial expression in a list comprehension can be any arbitrary expression, including another list comprehension.

段落大意

列表推导式的表达式可以是任意表达式,所以,这个表达式也可以是一个列表推导式。

我们直接看例子
有一个复杂列表

>>> matrix = [ [1, 2, 3, 4], [5, 6, 7, 8],[9, 10, 11, 12]]

这么看可能有点不明确,我们把书写方式调整下

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

这样看这个复杂列表就比较明确了吧。
在数学上,这是一个3X4的矩阵,现在,我们要把它变换为4X3的矩阵。

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

能区分开他们吗?

  • row[i]
    这是列表的下标取值
  • [row[i] for row in matrix]
    这是一个列表推导式,它被作为另一个列表推导式的表达式
  • for i in range(4)
    这是另一个列表推导式的for循环部分。

试试弄明白他的运算过程~
今天就讲到这里~

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 很实用的编程英语词库,共收录一千五百余条词汇。 第一部分: application 应用程式 应用、应用程序app...
    春天的蜜蜂阅读 1,335评论 0 22
  • 心无停靠的地方,到哪里都是流浪。
    微言言阅读 104评论 0 0
  • 没有人是一座孤岛,每本书都是一个世界。 好久没有那么酣畅淋漓的阅读体验,好久没有哪怕困的要命也舍不得合上书的感觉,...
    A橘子酱阅读 220评论 0 0
  • 21312s
    郭解依阅读 145评论 0 0