我想让我的代码变得更像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]
我做错了什么?提前谢谢!
答案 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))