Python列表生成

Python 如何写复杂的列表生成式

2017-04-24  本文已影响36人  46e30b30ea3f

我们首先实现一个在二维列表中找 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]

看到我们的 sublistx 是在列表生成式中定义的,但是在外面也可以访问,当然,Python3 中已经修复了这个问题

上一篇 下一篇

猜你喜欢

热点阅读