在Python中,你可以在一个列表推导式中有多个迭代器,比如

[(x,y) for x in a for y in b]

我知道Python的列表推导式的嵌套循环语义。

我的问题是:理解中的一个迭代器可以指向另一个迭代器吗?换句话说:我能得到这样的东西吗?

[x for x in a for a in b]

外部循环的当前值是内部循环的迭代器?

举个例子,如果我有一个嵌套列表:

a=[[1,2],[3,4]]

要实现这个结果,列表理解表达式是什么:

[1,2,3,4]

?? (请只列出理解性的答案,因为这是我想知道的)。


当前回答

此外,您可以对当前访问的输入列表成员和该成员中的元素使用相同的变量。然而,这甚至可能使它更加难以理解。

input = [[1, 2], [3, 4]]
[x for x in input for x in x]

首先计算输入中的x,导致输入的一个成员列表,然后,Python遍历x中的x的第二部分,在此期间x的值被它正在访问的当前元素覆盖,然后第一个x定义我们想要返回的内容。

其他回答

我觉得这样更容易理解

[row[i] for row in a for i in range(len(a))]

result: [1, 2, 3, 4]

此外,您可以对当前访问的输入列表成员和该成员中的元素使用相同的变量。然而,这甚至可能使它更加难以理解。

input = [[1, 2], [3, 4]]
[x for x in input for x in x]

首先计算输入中的x,导致输入的一个成员列表,然后,Python遍历x中的x的第二部分,在此期间x的值被它正在访问的当前元素覆盖,然后第一个x定义我们想要返回的内容。

用你自己的建议来回答你的问题:

>>> [x for b in a for x in b] # Works fine

当你要求列表理解答案时,让我也指出优秀的itertools.chain():

>>> from itertools import chain
>>> list(chain.from_iterable(a))
>>> list(chain(*a)) # If you're using python < 2.6

哎呀,我想我找到了答案:我没有足够关心哪个循环是内部的,哪个是外部的。列表推导式应该是这样的:

[x for b in a for x in b]

为了得到想要的结果,一个当前值可以作为下一个循环的迭代器。

这个flat_nlevel函数递归调用嵌套的list1来转换到一个级别。试试这个

def flatten_nlevel(list1, flat_list):
    for sublist in list1:
        if isinstance(sublist, type(list)):        
            flatten_nlevel(sublist, flat_list)
        else:
            flat_list.append(sublist)

list1 = [1,[1,[2,3,[4,6]],4],5]

items = []
flatten_nlevel(list1,items)
print(items)

输出:

[1, 1, 2, 3, 4, 6, 4, 5]