python-列表推导式

1. 一个简单的例子

在Python中,如果我们想修改列表中所有元素的值,可以使用for循环语句来实现。

例如,将一个列表中的每个元素都替换为它的平方:

image

另一种优雅的实现方式就是使用列表推导式(List Comprehensions):

image

2. 基本语法

我们具体来分析上面给出的例子

>>> L=[x**2 for x in L]

我们将列表推导式写在一个方括号内,因为它最终构建的是一个列表。

列表推导式主要由两部分构成:

循环变量表达式 (x ** 2)

for 循环头部 (for x in L)

是不是非常简单!

3. 工作原理

Python在执行列表推导式时,会对可迭代对象L进行迭代,将每一次迭代的值赋给循环变量x,然后收集变量表达式x ** 2的计算结果,最终由这些结果构成了新的列表,也就是列表推导式所返回的值。

只要支持for循环进行迭代的对象,都可以对它使用列表推导式。

例如,我们将一个字符串进行移位处理:

image

4. 高级语法

除了像上面介绍的[x ** 2 for x in L]这种基本语法之外,列表推导式还有一些高级的扩展。

4.1. 带有if语句

我们可以在for语句后面跟上一个if判断语句,用于过滤掉那些不满足条件的结果项。

例如,我想去除列表中所有的偶数项,保留奇数项,可以这么写:

image

4.2. 带有for嵌套

在复杂一点的列表推导式中,可以嵌套有多个for语句。按照从左至右的顺序,分别是外层循环到内层循环。

例如:

image

4.3. 既有if语句又有for嵌套

列表推导式可以带任意数量的嵌套for循环,并且每一个for循环后面都有可选的if语句。

通用语法:

image

例如,下面的代码输出了0~4之间的偶数和奇数的组合。

image

等价于下面的一般 for 循环:

image

4.4. 列表推导式生成矩阵

生成矩阵的方式有多种,例如手动赋值、一般for循环,还有就是列表推导式。如果我们要用列表推导式生成下面的矩阵,可以怎么写?

image

一种方法是:

image

矩阵的列数少时可以使用这种方法。

如果矩阵的列数较多,我们可以使用另外一种方式:在循环变量的表达式中使用列表推导式。

具体代码如下:

image

与之前带for嵌套的语法不同,这个例子中,实际使用的是最基本的[expression for x in L]语法,只有一个for语句。

复杂的地方在于前面的变量表达式expression不再是简单的变量运算,而是一个列表推导式,在这个例子中就是[y for y in range(x, x+3)]。

内层的列表推导式返回一个行向量,而这些行向量经由外层的列表推导式,最终形成一个二维列表,也就是我们想要的矩阵。

当然,在实际的应用中不能单纯追求代码的简洁,还要考虑到代码的可读性和维护成本。

如果代码变得过于复杂,不易于理解,我们宁可多写几行代码来增加它的可读性。

5. 生成器表达式

生成器表达式与列表推导式的语法相同,区别在于生成器表达式的外面使用圆括号,而列表推导式使用方括号。

6. 集合推导式和字典推导式

注意:集合推导式和字典推导式只有在Python2.7以及之后的版本中才有,Python2.7之前的版本不支持这两种推导式。

集合推导式的语法与列表推导式相同,只需要把外面的方括号改成花括号即可。

例如,我们可以通过以下方式来生成一个集合:

image

字典推导式的外面也是使用花括号,不过花括号的内部需要包含键值两部分。

在值不重复的情况下,我们可以通过字典推导式快速交换键值对:

image

总结:

在编写或是阅读这类推导式的时候,一定要注意先从for..in开始,最后再看前面的循环变量表达式。

作者:我爱学python
链接:https://www.jianshu.com/p/8fb41bb853d2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

推荐阅读更多精彩内容

  • 列表推导式,也叫列表生成式,是一种方便生成列表的语句。 比如我们要将一个全是整数的列表中每个数取平方后放入新的列表...
    猫与测试阅读 704评论 0 1
  • 一.什么是推导式 推导式是从一个或者多个迭代器快速简洁地创建数据类型的一种方法,它将循环和条件判断结合,从而避免语...
    C_Z_Q_阅读 257评论 0 0
  • 列表推导式:和列表一样,也采用方括号 [] 表示,并且用到了一个简写版的 for 循环,将推导式开始的那个表达式映...
    BI罗阅读 1,712评论 0 0
  • 最近发现一个问题,我们用python从数据库里通过游标cursor拿到的数据,大部分可以看成二维列表,那么如果需要...
    palexe阅读 3,506评论 0 5
  • 课不在多,而在精,语文老师改掉“机械无味的陈述、唠唠叨叨的重复”的习惯,重演绎、重互动、重效果,用精微课代替大课、...
    艾米怡然浩然阅读 109评论 2 4