如何基于相同的键值对组合数组中的字典?

时间:2015-03-31 10:32:46

标签: python arrays dictionary

例如,在下面的列表中,我想组合所有共享相同“id”和“name”的词典。

输入:

l = [{'id':'1','name':'a','key1':'1'},
     {'id':'1','name':'a','key2':'3'},
     {'id':'1','name':'a','key3':'4'},
     {'id':'2','name':'a','key5':'1'},
     {'id':'2','name':'a','key7':'c'},
     {'id':'1','name':'b','key5':'1'}]

期望的结果:

l = [{'id':'1','name':'a','key1':'1','key2':'3','key3':'4'},
     {'id':'2','name':'a','key5':'1','key7':'c'},
     {'id':'1','name':'b','key5':'1'}]

如果可能的话,我希望函数也可以使用不同数量的参数来确定字典必须共享哪些键才能合并。例如,如果我只想基于'id'而不是'key'和'name'进行组合,结果会有所不同。

2 个答案:

答案 0 :(得分:0)

itertools.groupby为您分组。剩下要做的就是将字典的迭代列表(按id分组)合并到一个字典列表中:

>>> import itertools    
>>> l = [ dict(reduce(lambda a, b: a + b.items(), lst, [])) for lst in \
          [ list(grouper) for key, grouper in \
            itertools.groupby(l, lambda x: (x["id"], x["name"])) ] \
        ]
>>> l
[{'id': '1', 'key1': '1', 'key2': '3', 'key3': '4', 'name': 'a'},
 {'id': '2', 'key5': '1', 'key7': 'c', 'name': 'a'},
 {'id': '1', 'key5': '1', 'name': 'b'}]

这显然不是最易读的版本;你应该使用一个帮助函数来合并字典而不是嵌套的列表推导。

答案 1 :(得分:0)

传统方式:D

result = []

for item in l :
    check = False
    # check item, is it exist in result yet (r_item)
    for r_item in result :
        if item['id'] == r_item['id'] and item['name'] == r_item['name'] :
            # if found, add all key to r_item ( previous record)
            check = True
            r_item.update( item )
    if check == False :
        # if not found, add item to result (new record)
        result.append( item )