合并两个python的dicts列表

时间:2014-05-27 15:08:42

标签: python list dictionary

我正在尝试使用两个列表,每个列表都是具有相同键的字典列表,并且每个列表的输出版本仅包含共享其中一个键的公用值的字典。例如:

#before:

json1 = [{'id':1, 'name':'john', 'age': 3}, {'id':2, 'name':'jack', 'age':5}]
json2 = [{'id':3, 'name':'john', 'age': 5}, {'id':1, 'name':'jill', 'age':3}]

#Do some operation that merges based on the key 'id'

json1 = [{'id':1, 'name':'john', 'age': 3}]
json2 = [{'id':1, 'name':'jill', 'age':3}]

因此,合并基于id的dicts列表将输出我上面写的内容。基于另一个密钥(称为“名称”)进行合并只会保留每个列表的第一个字典。

有没有人知道这样做的好方法?

修改 对于列表名称感到抱歉,我想这非常准确我会称之为json1和json2

2 个答案:

答案 0 :(得分:3)

我认为你的合并功能可能是那样的

def merge(key, l1, l2):
    k1 = { d[key] for d in l1 }
    k2 = { d[key] for d in l2 }
    keys = k1.intersection(k2)
    f1 = [ d for d in l1 if d[key] in keys ]
    f2 = [ d for d in l2 if d[key] in keys ]
    return f1, f2

那是:

  • 获取用于合并的密钥的值(在您的示例' id'或' name')中 成套以避免重复
  • 在2套
  • 中找到常用值
  • 仅保留初始列表中的键,其中键使用其中一个常用值

如果你选择merge('id', json1, json2),你得到的结果为json1和json2的2元组

答案 1 :(得分:1)

假设我了解你,我会在两个过程中执行此操作:首先找到常用值,然后构建新列表:

>>> j1 = [{'id':1, 'name':'john', 'age': 3}, {'id':2, 'name':'jack', 'age':5}]
>>> j2 = [{'id':3, 'name':'john', 'age': 5}, {'id':1, 'name':'jill', 'age':3}]
>>> jj = (j1, j2)
>>> common = set.intersection(*({d['id'] for d in j} for j in jj))
>>> common
set([1])
>>> jjnew = [[d for d in j if d['id'] in common] for j in jj]
>>> jjnew
[[{'age': 3, 'id': 1, 'name': 'john'}], [{'age': 3, 'id': 1, 'name': 'jill'}]]

同样适用于name

>>> common = set.intersection(*({d['name'] for d in j} for j in jj))
>>> jjnew = [[d for d in j if d['name'] in common] for j in jj]
>>> jjnew
[[{'age': 3, 'id': 1, 'name': 'john'}], [{'age': 5, 'id': 3, 'name': 'john'}]]