根据某些键/值对从合并列表中合并dicts

时间:2016-04-08 10:13:10

标签: python dictionary

我有一个下面显示的dicts列表,我想将一些dicts合并为一个基于某个键/值对的。

 [
    {'key': 16, 'value': 3, 'user': 3, 'id': 7}, 
    {'key': 17, 'value': 4, 'user': 3, 'id': 7}, 
    {'key': 17, 'value': 5, 'user': 578, 'id': 7}, 
    {'key': 52, 'value': 1, 'user': 3, 'id': 48}, 
    {'key': 46, 'value': 2, 'user': 578, 'id': 48}
]

现在您可以看到dict 1 & 2具有与用户相同的值& id 键。因此可以合并这两个词组,如

 [
    {'key': [16,17], 'value': [3,4], 'user': 3, 'id': 7}, 
    {'key': [17], 'value': [5], 'user': 578, 'id': 7}, 
    {'key': [52], 'value': [1], 'user': 3, 'id': 48}, 
    {'key': [46], 'value': [2], 'user': 578, 'id': 48}
]

意味着user & id值必须是唯一的。什么是合并的有效方式(如果可能的话)

3 个答案:

答案 0 :(得分:2)

以下函数会将字典列表转换为新格式:

def convert(d):
    res = {}
    for x in d:
        key = (x['user'], x['id'])
        if key in res:
            res[key]['key'].append(x['key'])
            res[key]['value'].append(x['value'])
        else:
            x['key'] = [x['key']]
            x['value'] = [x['value']]
            res[key] = x

    return res.values()

它将改变原始词典,结果中词典的顺序将是随机的。当应用于输入时,它将产生以下结果:

[
    {'id': 7, 'value': [5], 'key': [17], 'user': 578}, 
    {'id': 7, 'value': [3, 4], 'key': [16, 17], 'user': 3}, 
    {'id': 48, 'value': [1], 'key': [52], 'user': 3}, 
    {'id': 48, 'value': [2], 'key': [46], 'user': 578}
]

答案 1 :(得分:2)

dicts成为您原始的词典列表。这个想法将用户和id的唯一组合映射到defaultdict(list)个对象。最终结果将是该字典中的值列表。

from collections import defaultdict
tmp = defaultdict(dict)

for info in dicts:
    tmp[(info['user'], info['id'])].setdefault('key', []).append(info['key'])
    tmp[(info['user'], info['id'])].setdefault('value', []).append(info['value'])

for (user, id_), d in tmp.items(): # python2: use iteritems
    d.update(dict(user=user, id=id_))

result = list(tmp.values()) # python2: tmp.values() already gives a list
del tmp

答案 2 :(得分:0)

您可以使用以下聚合函数:

{{1}}