列表推导式

列表推导式(list comprehension)是python里很方便的一种语法形式,我们可以用它来转换和过滤数据。

写法

列表推导式的写法很简单:

[表达式 for 变量 in 列表 if 条件]

转换数据

比如想要从一到十装换成一到十的平方,就可以用

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

过滤数据

比如我想找出一到十中的偶数,可以这样写

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

与字典搭配使用

列表推导式可以与字典的构造函数配合使用,例如想造一个字典,键是一到十,值是一到十的平方

>>> dict([(x,x*x) for x in range(1,11)])
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}

算21点

21点的游戏相信很多人都玩过,现在先只考虑加法,如果要编一个python代码列出哪4张牌相加能组成21点,这个程序该怎么编呢?如果用列表推导式就能很简单的写出来。

[(a,b,c,d) for a in range(1,14) for b in range(a,14) for c in range(b,14) for d in range(c,14) if a+b+c+d==21]

集合推导式

如果列表推导式的结果里有很多重复项的话,可以使用集合推导式,他的语法就是把列表推导式外面的方括号换为花括号,如

>>> {x for y in range(2,8) for x in range(y*2,51,y)}
set([4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50])

生成器推导式

若把列表推导式的方括号换为圆括号,则返回结果是一个生产器

>>> (x*x for x in range(1,11))
<generator object <genexpr> at 0x1007ec2d0>

练习

已知

A = [1,2,3]
B = [11,22,33]
C = [True,False,True]

要求:通过A, B, C构造一个新的列表,当对应位置的C的值为真时取A的值,当为假时取B的值

解:

[x if z else y for x,y,z in zip(A,B,C)]
# [1, 22, 3]

results matching ""

    No results matching ""