[Python]学习:黑魔法之列表推导式(list comprehension)
在学习python的时候看到一个不同于我以前学过的语言的语法糖,(list comprehension)列表推导式,这样玩意让我觉得有数学的美感。
列表推导式格式为
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
y=[x*x for x in range(10)]
print(y)
运行结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
一行简单的语句就完成了如复杂操作
def square_list(count):
list = []
for i in range(count) :
list.append(i)
return list
y = square_list(10);
不止于此列表推到式还可以增加更多的for 来形成相当多层 for循环的效果
z = [y for x in range(10) for y in range(10)];
这个语句相当于
z =[]
for x in range(10):
for y in range(10):
z.append(y)
数据的输出结果是
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我们也可以生成更多表项的列表
z = [(x,y) for x in range(10) for y in range(10)]
输出结果
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
如果你并不是想要一个顺序的列表而是比如说要 5的倍数这样的值我们也可以通过给列表推导式添加if来生成我们要的列表
z = [ x for x in range(100) if x%5 == 0 ]
这样就能得到我们想要的列表了
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
同样的对多重的列表推导式也有用
z= [(x,y) for x in range(10) for y in range(10) if x == y ]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
使用for if for if 的方式也可以进行
z = [ (x,y) for x in range(100) if x%5 == 0 for y in range(100) if y%5 == 0 and x == y]
[(0, 0), (5, 5), (10, 10), (15, 15), (20, 20), (25, 25), (30, 30), (35, 35), (40, 40), (45, 45), (50, 50), (55, 55), (60, 60), (65, 65), (70, 70), (75, 75), (80, 80), (85, 85), (90, 90), (95, 95)]
我们有时候不止需要只是单纯的数字也可是是函数的返回值或者表达式
def numberString(number) :
return'number:'+str(number)
z = [numberString(x)+'$' for x in range(1)]
这样就可以得到我们想要的字符串列表了
['number:0$', 'number:1$', 'number:2$', 'number:3$', 'number:4$', 'number:5$', 'number:6$', 'number:7$', 'number:8$', 'number:9$']
总结:
这个方式生成的代码可以使得代码很优雅,但是对于其他程序员(其他语言)来说这种方式的语句可读性不太好。
参考
《Python基础教程 第二版 修订版》P82
官方指南