如何在列表理解python中构建两个for循环

2024-04-26 09:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两份清单如下

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)

如何将这两个循环写成一个单行列表理解?


Tags: inrightyouforiftagtags条目
3条回答

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

这应该做到:

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

合适的信用证是

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

相关问题 更多 >