在列表综合双迭代(Double Iteration in List Comprehension)

2019-06-17 18:02发布

在Python中你可以有多个迭代器列表中的理解,像

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

对于一些合适的序列a和b。 我知道Python的列表内涵的嵌套循环语义。

我的问题是:在修真一个迭代器可以参考其他的? 换句话说:我能有这样的事情:

[x for x in a for a in b]

其中外循环的当前值是所述内的迭代器?

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

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

将列表解析表达式是怎样实现这样的结果:

[1,2,3,4]

?? (请只列出理解答案,因为这是我想找出什么)。

Answer 1:

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

>>> [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


Answer 2:

哎呀,我想我找到了anwser:我没有照顾有足够的了解,其循环是内,这是外。 该列表理解应该是这样的:

[x for b in a for x in b]

以获得期望的结果,是的,一个电流值可以为下一个循环迭代。



Answer 3:

我希望这可以帮助别人,因为别人a,b,x,y没有太大的意义给我! 假设你有一个完整的句子的文字和你想的话阵列。

# Without list comprehension
list_of_words = []
for sentence in text:
    for word in sentence:
       list_of_words.append(word)
return list_of_words

我喜欢把列表理解为横向拉伸代码。

尝试将其分成:

# List Comprehension 
[word for sentence in text for word in sentence]


Answer 4:

迭代器的顺序似乎违反直觉。

举个例子: [str(x) for i in range(3) for x in foo(i)]

让我们来分解它:

def foo(i):
    return i, i + 0.5

[str(x)
    for i in range(3)
        for x in foo(i)
]

# is same as
for i in range(3):
    for x in foo(i):
        yield str(x)


Answer 5:

ThomasH已经加入一个很好的答案,但我想说明会发生什么:

>>> a = [[1, 2], [3, 4]]
>>> [x for x in b for b in a]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

>>> [x for b in a for x in b]
[1, 2, 3, 4]
>>> [x for x in b for b in a]
[3, 3, 4, 4]

我想Python解析列表解析由左到右。 这意味着,第一for发生将首先执行循环。

这样做的第二个“问题”是, b被“泄露”出来的列表理解的。 第一次成功列表解析后b == [3, 4]



Answer 6:

如果你想保持多维数组,一个应该巢阵列支架。 见下面的例子,其中一个被添加到每一个元素。

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

>>> [[col +1 for col in row] for row in a]
[[2, 3], [4, 5]]

>>> [col +1 for row in a for col in row]
[2, 3, 4, 5]


Answer 7:

此外,你可以只使用相同的变量将目前访问输入列表中的成员该成员中的元素。 然而,这甚至可能会更高(名单)难以理解。

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

首先for x in input被评估,导致输入的一个成员列表,然后,Python的遍历第二部分for x in x ,在此期间的x值是通过它正在访问当前元素,则第一覆盖x定义我们想返回。



Answer 8:

我觉得这是比较容易理解

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

result: [1, 2, 3, 4]


文章来源: Double Iteration in List Comprehension