让我们说,我们有变量中的对象列表称为“文章”,每个对象都有一个成员“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]
谢谢!
答案 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]
这具有
的优点(tag.name, tag.description, tag.count)
或其他元组或标记转换),则使其更具可读性