因此,在我的上一篇文章中,我被误认为是因为我误解了两者之间的差异,并想知道这两者之间的差异。
有人告诉我item['data'] for item in data ['issues']
是一个列表。
每当我print(item['data'] for item in data ['issues'])
到我的终端时,它都会返回一个生成器对象而不是数据列表。像这样
<generator object <genexpr> at 0x7ff125beb410>
我还被告知list(item['data'] for item in data ['issues'])
意味着我将其视为字典。但是从我对字典的理解来看,每个值都与一个键配对,并且在我的终端中以print(list(item['data'] for item in data ['issues']))
返回的数据对我来说就像一个列表。这是返回的内容:
['20898', '20796', '20781', '20707', '20705', '20561']
所以我的问题:
当返回的数据是生成器对象,而另一个返回的是看起来像列表的数据时,为什么list(item['data'] for item in data ['issues'])
被认为是字典,而item['data'] for item in data ['issues']
被认为是列表?
他们试图告诉我的内容可能有些遗漏,所以这是我的另一篇参考书Return nested JSON item that has multiple instances
答案 0 :(得分:1)
首先,让我们创建一些示例数据(字典):
data = {'issues': [{'data': '20898'}, {'data': '20796'}, {'data': '20781'}, {'data': '20707'}, {'data': '20705'}, {'data': '20561'}]}
下面的表达式将创建一个生成器对象,因此将仅对其进行一次迭代以使对象中的每个元素恰好产生一次:
(item['data'] for item in data ['issues'])
返回:
<generator object <genexpr> at 0x0000026BBE5ECB88>
与列表理解相反,它实际上将返回可以多次迭代的列表(以下两个语句等效):
list(item['data'] for item in data ['issues'])
[item['data'] for item in data ['issues']]
两次返回:
['20898', '20796', '20781', '20707', '20705', '20561']
这些输出都不是字典。提供给这些语句的输入的data
是字典。基本上,如果您要做的只是迭代一次,则使用生成器表达式。如果要存储和使用生成的结果,则最好使用列表理解功能。
答案 1 :(得分:1)
您用于列表理解的语法正确,替代语法为:[item['data'] for item in data['issues']]
-即用方括号括住表达式。
为澄清起见,以下表达式是生成器表达式:
item['data'] for item in data ['issues']
仅当将其包装在list()
或[]
中时,它才会成为列表,如下所示:
list(item['data'] for item in data ['issues'])
或者,
[item['data'] for item in data ['issues']]
在另一个问题中,提到要将item['fields']['components']
视为字典,因为您尝试对['name']
下标以获得值。一个下标字典是通过键而不是列表来实现的。
如果您仔细注意,item['fields']['components']
的值也将括在方括号中,这意味着它是一个列表;并且该列表包含一个字典作为第一个元素,该字典作为名为name
的键。