我正在访问词典项目list_of_dict = [{'ka':'1a', 'kb':'1b', 'kc':'1c'},{'ka':'2a'},{'ka':'3a', 'kb':'3b', 'kc':'3c'}]
的列表,并尝试使用函数article_list
有条件地将每个条目附加到另一个列表add_entries
。
我想要的输出
article_list = [{x:1a, y:1b, z:1c}, {x:2a}, {x:3a, y:3b, z:3c}]
我的代码:
def add_entries(list_of_dict):
keys = ['x','y','z']
#defining a temporary dictionary here
my_dict = dict.fromkeys(keys,0)
entry_keys = ['ka','kb','kc']
my_list = []
for item in list_of_dict:
# conditionally append the entries into the temporary dictionary maintaining desired key names
my_dict.update({a: item[b] for a,b in zip(keys, entry_keys) if b in item})
my_list.append(my_dict)
return my_list
if __name__ == "__main__":
list_of_dict = [{'ka':'1a', 'kb':'1b', 'kc':'1c'},{'ka':'2a'},{'ka':'3a', 'kb':'3b', 'kc':'3c'}]
article_list = []
returned_list = add_entries(list_of_dict)
article_list.extend(returned_list)
我的输出
article_list = [{x:3a, y:3b, z:3c}, {x:3a, y:3b, z:3c}, {x:3a, y:3b, z:3c}]
您可以使用它。
keys=['x','y','z']
res=[{k1:d[k]} for d in list_of_dict for k,k1 in zip(d,keys)]
输出
[{'x': '1a'},
{'y': '1b'},
{'z': '1c'},
{'x': '2a'},
{'x': '3a'},
{'y': '3b'},
{'z': '3c'}]
尝试一下:
list_new_d=[]
for d in list_of_dict:
new_d={}
for k,v in d.items():
if k == 'ka':
new_d['x'] = v
if k == 'kb':
new_d['y'] = v
if k == 'kc':
new_d['z'] = v
list_new_d.append(new_d)
怎么了
my_list.append(my_dict)
向my_dict
对象的my_list
对象附加reference。因此,在您的示例的for
循环末尾,my_list
是内存中完全相同的字典的引用列表。
您可以使用功能id
亲自查看。至少在CPython中,id
基本上为您提供了对象的内存地址。如果您这样做
article_list.extend(returned_list)
print([id(d) for d in article_list])
您将获得相同内存地址的列表。在我的机器上,我得到
[139920570625792, 139920570625792, 139920570625792]
结果是更新字典会影响列表中的“所有字典”。 (之所以如此,是因为您的列表中实际上没有字典,只是引用了完全相同的字典)。因此最后,您只能看到最后的更新操作。
可以在此答案https://stackoverflow.com/a/30340596/8791491中找到有关Python中的引用和对象的很好的讨论
修复
在my_dict
循环内移动for
的定义,这意味着您会为my_list
的每个元素获得一个新的单独的词典。现在,更新操作将不会影响列表中的其他词典,并且my_list
是对多个不同词典的引用的列表。
def add_entries(list_of_dict):
keys = ['x','y','z']
entry_keys = ['ka','kb','kc']
my_list = []
for item in list_of_dict:
#defining a new dictionary here
my_dict = dict.fromkeys(keys,0)
# conditionally append the entries into the temporary dictionary maintaining desired key names
my_dict.update({a: item[b] for a,b in zip(keys, entry_keys) if b in item})
my_list.append(my_dict)
return my_list