Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并两个python dict列表_Python_List_Dictionary - Fatal编程技术网

合并两个python dict列表

合并两个python dict列表,python,list,dictionary,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 m

我尝试获取两个列表,每个列表都是具有相同键的字典列表,每个列表的输出版本只包含共享其中一个键的公共值的字典。例如:

#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合并dict列表将输出我上面写的内容。基于另一个键(比如“name”)进行合并只会保留每个列表的第一个dict

有人知道这样做的好方法吗

编辑
对不起,关于列表名称,我想为了非常准确,我将称它们为json1和json2,假设我理解您的意思,我将分两步进行:首先查找公共值,然后构建新列表:

>>> 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'}]]
对于
名称
,类似地:

>>> 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'}]]

假设我理解你的意思,我会分两步来做:首先找到公共值,然后构建新列表:

>>> 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'}]]
对于
名称
,类似地:

>>> 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'}]]

我想你的合并函数可能是这样的

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”中) 以避免重复
  • 在两个集合中查找公共值
  • 仅保留初始列表中的DICT,其中键采用公共值之一

如果你使用
merge('id',json1,json2)
你会得到一个两元组的结果json1和json2

我想你的合并函数可能是这样的

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”中) 以避免重复
  • 在两个集合中查找公共值
  • 仅保留初始列表中的DICT,其中键采用公共值之一

如果您使用
merge('id',json1,json2)
您将得到结果json1和json2的两个元组

为什么您的列表命名为dict1和dict2=/你想在哪个ID上合并?就像我看到你的id=1,但是如果有其他id匹配呢?你只想挑一个吗?将其作为一个集合使用?在上述示例中没有其他ID匹配。只有第一个json的第0个索引和第二个json的第1个索引具有匹配的ID,因此它们将是每个json输出中唯一存在的字典。这就是我想要的。与其说是匹配某个id=1,不如说是在每个JSON中查找匹配的id,那么你只想使用一个集合,对吗?我很确定你不能对字典进行哈希运算,你想做一个集合是什么?我想保留每个字典中的所有其他信息(如示例中,我们在整个过程中保留姓名和年龄信息),为什么您的列表命名为dict1和dict2=/你想在哪个ID上合并?就像我看到你的id=1,但是如果有其他id匹配呢?你只想挑一个吗?将其作为一个集合使用?在上述示例中没有其他ID匹配。只有第一个json的第0个索引和第二个json的第1个索引具有匹配的ID,因此它们将是每个json输出中唯一存在的字典。这就是我想要的。与其说是匹配某个id=1,不如说是在每个JSON中查找匹配的id,那么你只想使用一个集合,对吗?我很确定你不能对字典进行哈希运算,你想做一个集合是什么?我希望保留每个字典中的所有其他信息(如在示例中,我们在整个过程中保留姓名和年龄信息)