如何在列表理解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调用))