在python中使用字典列表进行迭代时出现的异常行为

在python中使用字典列表进行迭代时出现的异常行为,python,arrays,dictionary,Python,Arrays,Dictionary,因此,我有一个包含对象列表的结果变量。所以我写了这个代码 entry = {} temp = [] temp2 = [] for result in results: entry['value'] = result['fb_id'] entry['label'] = result['full_name'] temp.append(entry) temp2.append(result) print (result) print (entry)

因此,我有一个包含对象列表的
结果
变量。所以我写了这个代码

entry = {}
temp = []
temp2 = []
for result in results:
    entry['value'] = result['fb_id']
    entry['label'] = result['full_name']

    temp.append(entry)
    temp2.append(result)

    print (result)
    print (entry)

print temp
print temp2
这张照片

{'fb_id': 17500787L, 'full_name': u'Sandipan Mondal'}  #this is result1
{'value': 17500787L, 'label': u'Sandipan Mondal'}      #this is entry1
{'fb_id': 597333664L, 'full_name': u'Aakash Tulsani'}  #this is result2
{'value': 597333664L, 'label': u'Aakash Tulsani'}      #this is entry2

[{'value': 597333664L, 'label': u'Aakash Tulsani'},       #this is temp
{'value': 597333664L, 'label': u'Aakash Tulsani'}]

[{'fb_id': 17500787L, 'full_name': u'Sandipan Mondal'},   #this is temp2
{'fb_id': 597333664L, 'full_name': u'Aakash Tulsani'}
现在
temp2
变量与预期一致,即
[result1,result2]
temp
变量不会出现这种情况。
它在重复条目2,这是因为您在每次迭代中都会覆盖条目的内容。这意味着您将在列表
temp
中保留一个引用列表,并将其添加到同一词典
条目
,并不断重复添加此词典。在每次迭代时重置字典:

for result in results:
    entry = {}

    entry['value'] = result['fb_id']
    entry['label'] = result['full_name']

    temp.append(entry)
    temp2.append(result)

    print (result)
    print (entry)
您根本不需要
temp2
,因为您在迭代的
results
列表中已经有了结果。所以就用这个吧。对于已转换的条目,如果您持有用于转换的键映射,则可以执行以下操作:

>>> m = {'fb_id': 'value', 'full_name': 'label'}
>>> [{m[k]: v for k, v in result.iteritems()} for result in results]
[{'label': u'Sandipan Mondal', 'value': 17500787L},
 {'label': u'Aakash Tulsani', 'value': 597333664L}]

这使用列表和字典理解来迭代结果中的每个字典,并从转换字典
m

中为每个键和值对获取正确的键,这是因为在每次迭代时都会覆盖
条目的内容。这意味着您将在列表
temp
中保留一个引用列表,并将其添加到同一词典
条目
,并不断重复添加此词典。在每次迭代时重置字典:

for result in results:
    entry = {}

    entry['value'] = result['fb_id']
    entry['label'] = result['full_name']

    temp.append(entry)
    temp2.append(result)

    print (result)
    print (entry)
您根本不需要
temp2
,因为您在迭代的
results
列表中已经有了结果。所以就用这个吧。对于已转换的条目,如果您持有用于转换的键映射,则可以执行以下操作:

>>> m = {'fb_id': 'value', 'full_name': 'label'}
>>> [{m[k]: v for k, v in result.iteritems()} for result in results]
[{'label': u'Sandipan Mondal', 'value': 17500787L},
 {'label': u'Aakash Tulsani', 'value': 597333664L}]

这将使用列表和字典理解来迭代结果中的每个字典,并从for循环内的转换字典
m

Move
entry={}
中获取每个键和值对的正确键。Move
entry={}
在for循环内。