列表理解返回“生成器对象...”

Bru*_*yne 6 python list-comprehension

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

\n\n

以下代码有效:

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

输出:

\n\n
[\'Merkel \xe2\x80\x9cHelix Suppressor\xe2\x80\x9d Rifle and Merkel Suppressors\', \'Angela Merkel\', \n \'Merkel says Europe should do more to stop Syria war - Reuters\', \n \'Merkel says Europe should do more to stop Syria war - Reuters\', \n \'Merkel muss weg! Merkel has to go! Demonstrations in Hamburg\', ... , \n "Bruised \'Queen\' Merkel Lives..."]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
def main():\n    ...\n    articles = []\n    articles.append(i[\'title\'] for i in news[\'articles\'])\n    print(articles)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
[<generator object main.<locals>.<genexpr> at 0x035F9570>]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
def main():\n    ...\n    articles = []\n    articles.append([i[\'title\'] for x in news for i in news[\'articles\']])\n    print(articles)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

Ori*_*ril 6

只需使用:

articles = [i['title'] for i in news['article']]
Run Code Online (Sandbox Code Playgroud)

列表理解已经返回一个列表,因此不需要创建一个空列表然后向其附加值。有关列表推导式的指南,您可以查看此内容

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

  • 列表推导式包含在“[ ]”中,类似于字典推导式包含在“{ }”中 (3认同)
  • @BruceWayne 列表理解用方括号包围(就像列表文字一样)。生成器表达式使用括​​号,如果生成器是函数调用的单个参数,则可以省略括号(例如`articles.append(i['title'] for i in news['articles'])`) 。 (3认同)