在Python中组合多个for循环

时间:2011-04-04 21:27:50

标签: python

让我们说,我们有变量中的对象列表称为“文章”,每个对象都有一个成员“tags”(这是简单的列表)。

预期输出:所有文章中的所有标记,加在一个列表中。

在多行中,解决方案是:

arr = []
for article in articles:
    for tag in article.tags:
       arr.append(tag)

现在,我们如何用单行而不是4?

来写这个

此语法无效:

arr = [tag for tag in article.tags for article in articles]

谢谢!

6 个答案:

答案 0 :(得分:10)

它无效,因为在解析第一个循环时article不存在。

arr = [tag for article in articles for tag in article.tags]

答案 1 :(得分:5)

您实际上是按照您不想订购的顺序循环:

你想要的是:

result = [ tag for article in articles for tag in article.tags ]

要翻译您在示例中所做的事情:

for tag in article.tags:
    for article in articles:
       #code

这没什么意义。

答案 2 :(得分:4)

也许

arr = [tag for tag in (a.tags for a in articles)]

答案 3 :(得分:2)

试试这个:

import itertools
it = itertools.chain.from_iterable(article.tags for article in articles)
l  = list(it) # if you really need a list and not an iterator

答案 4 :(得分:2)

如果您想要唯一标记,

可能会提供更好的服务
import operator
tags = reduce(operator.__or__, (set(article.tags) for article in articles), set())

修改

  • 对于Python 3,您需要

    from functools import reduce
    
  • 如果序列为空,则返回初始值设定项set(),而不是抛出错误。

答案 5 :(得分:1)

这已经多次回答了,但是打破行和缩进会很有帮助:

arr = [tag 
       for article in articles
           for tag in article.tags]

这具有

的优点
  1. 如果您需要对标记执行某种投影(例如获取(tag.name, tag.description, tag.count)或其他元组或标记转换),则使其更具可读性
  2. 使嵌套生成器表达式的语法对初学者更具可读性
  3. 使复杂的嵌套生成器表达式更具可读性