我正在尝试使用两个列表,每个列表都是具有相同键的字典列表,并且每个列表的输出版本仅包含共享其中一个键的公用值的字典。例如:
#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
答案 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
那是:
如果你选择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'}]]