138

我有两个列表如下

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

6 回答 6

210

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

因此,等效的列表理解将是:

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

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

[entry if tag in entry else [] for tag in tags for entry in entries]
于 2013-08-31T18:28:05.257 回答
184

这应该这样做:

[entry for tag in tags for entry in entries if tag in entry]
于 2013-08-31T18:28:04.980 回答
8

适当的 LC 将是

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

LC 中的循环顺序与嵌套循环中的循环顺序类似,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调用))

于 2013-08-31T18:27:48.503 回答
4

在理解中,嵌套列表迭代应该遵循与等效的叠层 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']
于 2020-05-23T18:39:29.483 回答
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']
于 2018-04-01T13:51:17.357 回答
0
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]
于 2020-08-13T15:00:49.377 回答