如何在列表理解python框架两个for循环
我有两个列表如下
tags = [u'man', u'you', u'are', u'awesome'] entries = [[u'man', u'thats'],[ u'right',u'awesome']]
我想从entries
提取条目:
result = [] for tag in tags: for entry in entries: if tag in entry: result.extend(entry)
我怎样才能把这两个循环写成单行列表的理解?
这应该做到这一点:
[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]
适当的LC将是
[entry for tag in tags for entry in entries if tag in entry]
LC中循环的顺序与嵌套循环中的循环相似,if语句结束,条件expression式开始,类似于
[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']
您在这里使用生成器expression式而不是列表理解。 (完全匹配79个字符限制(没有list
调用))