【问题标题】:Merge duplicate entries in array of dict合并dict数组中的重复条目
【发布时间】:2015-01-22 11:50:27
【问题描述】:

我正在努力解决递归合并问题。

假设我有:

a=[{'name':"bob", 
    'age':10, 
    'email':"bob@bla", 
    'profile':{'id':1, 'role':"admin"}}, 
   {'name':"bob", 
    'age':10, 
    'email':"other mail", 
    'profile':{'id':2, 'role':"dba"},
    'home':"/home/bob"
  }]

我需要一些东西来递归地合并条目。如果同一级别上现有给定键的值不同,则将值附加到数组中。

b = merge(a)
print b
{'name':"bob", 
 'age':10, 
 'email':["bob@bla","other mail"], 
 'profile':{'id':[1,2], 'role'=["admin", "dba"], 'home':"/home/bob"}

我写了这段代码:

def merge(items):
    merged = {}
    for item in items:
        for key in item.keys():
            if key in merged.keys():
                if item[key] != merged[key]:
                    if not isinstance(merged[key], list):
                        merged[key] = [merged[key]]
                    if item[key] not in merged[key]:
                        merged[key].append(item[key])
            else:
                merged[key] = item[key]
    return merged 

输出是:

{'age': 10,
 'email': ['bob@bla', 'other mail'],
 'home': '/home/bob',
 'name': 'bob',
 'profile': [{'id': 1, 'role': 'admin'}, {'id': 2, 'role': 'dba'}]}

这不是我想要的。

我不知道如何处理递归。

谢谢:)

【问题讨论】:

  • 你的代码在哪里,它到底有什么问题?
  • 正如我所说,我正在努力解决这个问题......
  • 所以你……什么都没有?这不是代码编写服务。
  • 好吧,其他几个主题也没有提供任何代码,我正在自己做一些事情,如果我能做到,我会发布它......我正在寻找建议.

标签: python arrays recursion dictionary merge


【解决方案1】:

当您遍历参数中的每个字典,然后遍历每个字典中的每个键和值时,您需要以下规则:

  1. 如果输出中没有针对该键的内容,则将新键和值添加到输出中;
  2. 如果该键有值,并且与新值相同,则什么也不做;
  3. 如果该键有一个值,并且它是一个列表,append 列表的新值;
  4. 如果该键有一个值,并且它是一个字典,则使用现有字典递归 merge 新值;
  5. 如果该键有值,并且它既不是列表也不是字典,则将输出中的值设为当前值和新值的列表。

在代码中:

def merge(*dicts):
    """Recursively merge the argument dictionaries."""
    out = {}
    for dct in dicts:
        for key, val in dct.items():
            try:
                out[key].append(val) # 3.
            except AttributeError:
                if out[key] == val:
                    pass # 2.
                elif isinstance(out[key], dict):
                    out[key] = merge(out[key], val) # 4.
                else:
                    out[key] = [out[key], val] # 5.
            except KeyError:
                out[key] = val # 1.
    return out

使用中:

>>> import pprint
>>> pprint.pprint(merge(*a))
{'age': 10,
 'email': ['bob@bla', 'other mail'],
 'home': '/home/bob',
 'name': 'bob',
 'profile': {'id': [1, 2], 'role': ['admin', 'dba']}}

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 2019-04-15
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多