两个JSON值列表 - 对某些键执行操作

时间:2016-09-14 14:35:31

标签: python json list dictionary

我有2个字典列表,如下所示:

x = [{'id':1,'num':5,'den':8},
     {'id':2,'num':3,'den':5},
     {'id':4,'num':11,'den':18},
     {'id':3,'num':2,'den':81},
     {'id':7,'num':10,'den':33}]

y = [{'id':1,'num':4,'den':9},
     {'id':6,'num':5,'den':11},
     {'id':3,'num':13,'den':83},
     {'id':2,'num':15,'den':28},
     {'id':4,'num':1,'den':2}]

现在,很明显,两个列表的每个(项目)字典中的键都是相同的。对于那些具有相同id的元素,我想要一个包含相应num = num(x) + num(y)den = den(x) + den(y)的新列表。因此,在这种情况下,输出将是:

z = [{'id':1,'num':9,'den':17},
     {'id':2,'num':18,'den':33},
     {'id':4,'num':12,'den':20},
     {'id':3,'num':15,'den':164}]

如何在大多数" pythonic"中实现这一目标?办法。我应该蛮力吗?

2 个答案:

答案 0 :(得分:1)

您可以使用list comprehension作为:

来实现它
>>> [{'id': i['id'], 'num': i['num'] + j['num'], 'den': i['den'] + j['den']} for i in x for j in y if i['id'] == j['id']]
[{'num': 9, 'id': 1, 'den': 17}, {'num': 18, 'id': 2, 'den': 33}, {'num': 15, 'id': 3, 'den': 164}, {'num': 12, 'id': 4, 'den': 20}]

答案 1 :(得分:0)

某种更具可读性的解决方案:

import collections
result = collections.defaultdict(lambda: {'num': 0,'den': 0})
for data in x + y:
    match = result[data['id']]
    match['num'] += data['num']
    match['den'] += data['den']
    match['id'] = data['id']
z = list(result.values())