迭代与python中的字典列表不一致的行为

sun*_*eet 0 python arrays dictionary

所以我有这个results包含对象列表的变量.所以我写这段代码

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
Run Code Online (Sandbox Code Playgroud)

这打印

{'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'}
Run Code Online (Sandbox Code Playgroud)

现在temp2变量出现了预期,[result1, result2]但是temp变量并没有发生.它正在重复entry2

msv*_*kon 5

那是因为你entry在每次迭代时都会覆盖内容.这意味着您将列表中的引用列表保存temp同一个字典中entry,并一遍又一遍地附加该字典.在每次迭代时重置字典:

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)
Run Code Online (Sandbox Code Playgroud)

你完全不需要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}]
Run Code Online (Sandbox Code Playgroud)

这使用列表和字典理解来迭代结果中的每个字典,并从转换字典中获取每个键和值对的正确键m.