我们首先实现一个在二维列表中找 3 的倍数的例子:
In [1]: nested_list = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
In [2]: result = []
In [3]: for sublist in nested_list:
...: for x in sublist:
...: if x % 3 == 0:
...: result.append(x)
...:
In [4]: result
Out[4]: [0, 3, 6, 9]
In [5]: result = [x for sublist in nested_list for x in sublist if x % 3 == 0]
In [7]: result
Out[7]: [0, 3, 6, 9]
看到列表生成式很简洁,但是初学者往往写着很困难,这是因为没有找到 “窍门”,我们这种双层循环列表生成式其实掌握了方法很简单,仔细看列表生成式可以写成如下格式:
result = [x
for sublist in nested_list
for x in sublist
if x % 3 == 0
]
看到其实和我们循环结构是一模一样的,只是写成了一行,掌握这个方法,就很容易的写出复杂的列表生成式,无论几层循环
值得注意的是,为了支持这种语法,列表生成式有一个奇怪的副作用,就是会泄露中间变量
In [1]: nested_list = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
In [2]: result = [x for sublist in nested_list for x in sublist if x % 3 == 0]
In [3]: x
Out[3]: 9
In [4]: sublist
Out[4]: [8, 9]
看到我们的 sublist
和 x
是在列表生成式中定义的,但是在外面也可以访问,当然,Python3 中已经修复了这个问题
网友评论