Python养成记

16、列表推导式

2022-03-30  本文已影响0人  魔方宫殿
Life is short, you need Python!

上集回顾:

  1. 数值
  2. 字符串
  3. 列表
  4. 元组
  5. 集合
  6. 字典

温故而知新,上集小P复习了Python的基础数据类型,果然又发现了一个新的知识。
如果想要得到一个平方数列表,比如1到3的为[1, 4, 9],可以口算出来,但是到10,到100呢,再算和直接写出来序列就会很不优雅。这时候可能第一想法是用循环实现:

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

不错,完美实现,到100还是到1000都没有问题。就是生成一个列表竟然要3行代码,有点不够简洁。等后面学习了map和lambda表达时的话,其实可以1行代码搞定:

>>> s2 = list(map(lambda x: x**2, range(1, 11)))
>>> s2
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

是不是酷毙了,但是其实还有更简洁的方式:

>>> s3 = [x**2 for x in range(1, 11)]
>>> s3
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

这就是列表推导式:对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表。也可以追加if子句进行条件判断,例如生成10以内的偶素列表:

>>> s4 = [x for x in range(1, 11) if x % 2 == 0]
>>> s4
[2, 4, 6, 8, 10]

所以列表推导式的内容可以表述为:一个表达式,后面为一个 for 子句,然后是零个或多个 for 或 if 子句。结果是由表达式依据 for 和 if 子句求值计算而得出一个新列表。举个例子,将两个列表中不相等的元素组合起来:

>>> [(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)]

等同于:

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

列表推导式还可以使用复杂的表达式和嵌套函数:

>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

本集总结:

  1. 列表推导式的一般形式
  2. 列表推导式的复杂表达式

下集见

上一篇下一篇

猜你喜欢

热点阅读