如何在Python的列表推导式中嵌套两个for循环

171

我有以下两个列表

tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

entries中的条目属于tags时,我希望提取这些条目:

result = []

for tag in tags:
    for entry in entries:
        if tag in entry:
            result.extend(entry)

我怎样把这两个循环合并为一行的列表推导式?


4
如果您希望得到扁平化的列表,可以使用itertools.chainlist(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry)) - Ashwini Chaudhary
6个回答

263

记住这个最好的方法是,在列表推导式中for循环的顺序基于它们在传统循环方法中出现的顺序。最外层的循环先出现,然后是内部循环。

因此,等效的列表推导式将是:

[entry for tag in tags for entry in entries if tag in entry]

一般来说,if-else语句会在第一个for循环之前出现,如果你只有一个if语句,那么它会出现在最后。比如,如果你想要添加一个空列表,如果tag不在entry中,你可以这样做:

[entry if tag in entry else [] for tag in tags for entry in entries]

204

这应该可以:

[entry for tag in tags for entry in entries if tag in entry]

10
适当的 LC 应该是:
[entry for tag in tags for entry in entries if tag in entry]

LC(Lambda Calculus)中循环的顺序类似于嵌套循环,if语句放在末尾,条件表达式放在开头,如下所示:
[a if a else b for a in sequence]

请查看演示 -
>>> tags = [u'man', u'you', u'are', u'awesome']
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']]
>>> [entry for tag in tags for entry in entries if tag in entry]
[[u'man', u'thats'], [u'right', u'awesome']]
>>> result = []
    for tag in tags:
        for entry in entries:
            if tag in entry:
                result.append(entry)


>>> result
[[u'man', u'thats'], [u'right', u'awesome']]

编辑 - 由于您需要结果被压平,您可以使用类似的列表推导式,然后将结果压平。

>>> result = [entry for tag in tags for entry in entries if tag in entry]
>>> from itertools import chain
>>> list(chain.from_iterable(result))
[u'man', u'thats', u'right', u'awesome']

将这些内容加在一起,你可以直接执行以下代码:
>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
[u'man', u'thats', u'right', u'awesome']

你在这里使用了生成器表达式而不是列表推导式。(完美地匹配了79个字符的限制(不需要list调用))

8

在理解中,嵌套列表迭代应遵循与等效嵌套for循环相同的顺序。

为了理解这个问题,我们将从NLP中选取一个简单的例子。您想要创建一个单词列表,其中包含来自句子列表的所有单词,其中每个句子都是一个单词列表。

>>> list_of_sentences = [['The','cat','chases', 'the', 'mouse','.'],['The','dog','barks','.']]
>>> all_words = [word for sentence in list_of_sentences for word in sentence]
>>> all_words
['The', 'cat', 'chases', 'the', 'mouse', '.', 'The', 'dog', 'barks', '.']

为了消除重复的单词,你可以使用集合 {} 而不是列表 []。
>>> all_unique_words = list({word for sentence in list_of_sentences for word in sentence}]
>>> all_unique_words
['.', 'dog', 'the', 'chase', 'barks', 'mouse', 'The', 'cat']

或者应用list(set(all_words))

>>> all_unique_words = list(set(all_words))
['.', 'dog', 'the', 'chases', 'barks', 'mouse', 'The', 'cat']

2
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

result = []
[result.extend(entry) for tag in tags for entry in entries if tag in entry]

print(result)

输出:

['man', 'thats', 'right', 'awesome']

1
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]

8
你好,欢迎来到 Stack Overflow!请发布一篇解释性的文章,而不仅仅是代码。 - Evelyn
2
你好!虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Brian61354270

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接