【问题标题】:Merging two python lists of dicts合并两个字典的python列表
【发布时间】:2014-05-27 15:08:41
【问题描述】:

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

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

有谁知道这样做的好方法吗?

编辑 抱歉列表名称,我想非常准确,我将它们称为 json1 和 json2

【问题讨论】:

  • 为什么你的列表命名为 dict1 和 dict2? =/
  • 您要合并的 ID 是什么?就像我看到你有 id = 1 但是如果还有其他匹配的 id 呢?你只想选一个吗?把它当成一套来用?
  • 以上示例中没有其他 ID 匹配。只有第一个 json 的第 0 个索引和第二个 json 的第一个索引具有匹配的 ID,因此它们将是唯一保留到每个 json 输出的字典。这就是我想要的。与其说匹配某个 id=1,不如说是在每个 json 中找到匹配的 ID
  • 所以你只是想用一套吧?
  • 我很确定你不能散列字典,你有什么想法来做一个集合?我想保留每个字典中的所有其他信息(如示例中,我们在整个过程中保留姓名和年龄信息)

标签: python list dictionary


【解决方案1】:

我觉得你的合并功能可能是这样的

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 元组

【讨论】:

    【解决方案2】:

    假设我理解你,我会分两步完成:首先找到共同值,然后构建新列表:

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

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多