说我有一个dicts列表:
list = [{'name':'john','age':'28','location':'hawaii','gender':'male'},
{'name':'john','age':'32','location':'colorado','gender':'male'},
{'name':'john','age':'32','location':'colorado','gender':'male'},
{'name':'parker','age':'24','location':'new york','gender':'male'}]
在这个词典中,'name'可以被认为是唯一的标识符。我的目标是不仅为相同的dicts(即list [1]和list [2])重复删除此列表,而且还为单个'name'合并/追加不同的值(即list [0]和list [1/2]换句话说,我想将我的例子中的所有'name'='john'dicts合并到一个dict中,如下所示:
dedup_list = [{'name':'john','age':'28; 32','location':'hawaii; colorado','gender':'male'},
{'name':'parker','age':'24','location':'new york','gender':'male'} ]
到目前为止,我已经尝试创建我的第二个列表,dedup_list,并迭代第一个列表。如果'name'键在dedup_list的一个dicts中不存在,我会追加它。这是我陷入困境的合并部分。
for dict in list:
for new_dict in dedup_list:
if dict['name'] in new_dict:
# MERGE OTHER DICT FIELDS HERE
else:
dedup_list.append(dict) # This will create duplicate values as it iterates through each row of the dedup_list. I can throw them in a set later to remove?
我的dicts列表永远不会包含超过100个项目,因此O(n ^ 2)解决方案绝对可以接受但不一定理想。这个dedup_list最终会被写入CSV,所以如果有一个解决方案涉及到这个,我很满意。
谢谢!
答案 0 :(得分:2)
好吧,我即将围绕defaultdict
制定解决方案,但希望@hivert发布了我可以提供的最佳解决方案,即this answer:
from collections import defaultdict
dicts = [{'a':1, 'b':2, 'c':3},
{'a':1, 'd':2, 'c':'foo'},
{'e':57, 'c':3} ]
super_dict = defaultdict(set) # uses set to avoid duplicates
for d in dicts:
for k, v in d.iteritems():
super_dict[k].add(v)
即。我投票赞成将这个问题作为that question的愚蠢来解决。
N.B。:您不会获得'28; 32'
等值,而是获取包含[28,32]
的集合,然后可以根据需要将其处理为csv文件。
N.B.2:编写csv文件,看一下DictWriter类