首页 > 解决方案 > 列表理解返回“生成器对象...”

问题描述

我正在尝试从字典中简洁地创建一个列表。

以下代码有效:

def main():
    newsapi = NewsApiClient(api_key=API_KEY)
    top_headlines = newsapi.get_everything(q="Merkel",language="en")
    news = json.dumps(top_headlines)
    news = json.loads(news)
    articles = []
    for i in news['articles']:
        articles.append(i['title'])
    print(articles)

输出:

['Merkel “Helix Suppressor” Rifle and Merkel Suppressors', 'Angela Merkel', 
 'Merkel says Europe should do more to stop Syria war - Reuters', 
 'Merkel says Europe should do more to stop Syria war - Reuters', 
 'Merkel muss weg! Merkel has to go! Demonstrations in Hamburg', ... , 
 "Bruised 'Queen' Merkel Lives..."]

但我在其他地方看到过,并且一直在努力学习列表理解。for i in news['articles']:将循环替换为:

def main():
    ...
    articles = []
    articles.append(i['title'] for i in news['articles'])
    print(articles)

我期待得到类似的输出。相反,它返回:

[<generator object main.<locals>.<genexpr> at 0x035F9570>]

我找到了这个相关的解决方案,但是执行以下操作会输出标题(耶!)三次(嘘!):

def main():
    ...
    articles = []
    articles.append([i['title'] for x in news for i in news['articles']])
    print(articles)

通过列表理解生成文章的正确方法是什么?

忽略我有例程main()而不是函数调用。我稍后会解决这个问题。

标签: pythonlist-comprehension

解决方案


只需使用:

articles = [i['title'] for i in news['article']]

列表推导已经返回了一个列表,因此无需创建一个空的然后将值附加到它。有关列表推导的指南,您可以查看这个

关于生成器对象,这里的问题是在它们之间使用列表推导()(或者只是在它们没有被封闭时)将创建一个生成器而不是列表。有关生成器的更多信息以及它们与列表有何不同,请参阅生成器表达式与列表理解,对于生成器理解,请参阅生成器理解究竟是如何工作的?.


推荐阅读