Python Dedup / Merge Dicts列表

时间:2014-03-12 17:51:36

标签: python list dictionary deduplication

说我有一个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,所以如果有一个解决方案涉及到这个,我很满意。

谢谢!

1 个答案:

答案 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