字典和带有item ['data]的列表与list(item ['data])的列表之间的区别

时间:2018-12-13 16:00:22

标签: python python-3.x

因此,在我的上一篇文章中,我被误认为是因为我误解了两者之间的差异,并想知道这两者之间的差异。

有人告诉我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

2 个答案:

答案 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的键。