如何在列表内涵巨蟒中为循环设置2

我有以下两个列表

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)

如何将两个循环写成单行列表内涵?

192318 次浏览

适当的信用证应该是

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

EDIT -因为需要将结果压平,所以可以使用类似的列表内涵,然后将结果压平。

>>> 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调用))

这个应该可以:

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

记住这一点的最好方法是,列表内涵中 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]
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']

在理解方面,嵌套列表迭代应该遵循与等效的 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', '.']

要删除重复的单词,可以使用 set {}代替 list []

>>> 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']
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]