如何将一对嵌套的for循环重写为综合列表表达式

时间:2012-08-09 21:54:26

标签: python

我想让我的代码变得更像Pythonic。

有一个简单的列表列表,如

numbers = [[1, 2], [3, 4, 5]]

我想这样做:

mylist = []
for sublist in numbers:
  for number in sublist:
      mylist.append(number)

但是在一行中,使用全面的列表定义:

mylist = [ number for number in  sublist for sublist in numbers] 

然而,我得到的结果是[3,3,4,4,5,5]

我做错了什么?提前谢谢!

2 个答案:

答案 0 :(得分:11)

for循环的顺序错误 - 应该是

mylist = [number for sublist in numbers for number in sublist]

代替。人们经常发现这令人惊讶;只需使用与嵌套for循环中相同的顺序。

您可以使用的替代方案是

from itertools import chain

mylist = list(chain.from_iterable(numbers))

答案 1 :(得分:2)

我个人觉得嵌套列表推导难以阅读和理解。 itertools标准库有一个方便的chain函数:

  

chain(*iterables) --> chain object

     

返回一个链式对象,其.next()方法返回的元素   第一次迭代,直到它耗尽,然后从下一个元素   迭代,直到所有的迭代都用完为止。

所以你会这样做:

import itertools
mylist = list(itertools.chain(*numbers))