【问题标题】:Comparing dicts, updating NOT overwriting values [duplicate]比较字典,更新不覆盖值[重复]
【发布时间】:2020-02-24 14:08:19
【问题描述】:

不是在寻找这样的东西:

How do I merge two dictionaries in a single expression?

Generic way of updating python dictionary without overwriting the subdictionaries

Python: Dictionary merge by updating but not overwriting if value exists

正在寻找这样的东西:

输入:

d1 = {'a': 'a', 'b': 'b'}
d2 = {'b': 'c', 'c': 'd'}

输出:

new_dict = {'a': ['a'], 'b': ['b', 'c'], 'c': ['d']}

我有以下代码有效,但我想知道是否有更有效的方法:

首先,我创建一个列表“unique_vals”,其中存储了两个字典中存在的所有值。 由此,创建了一个新字典,用于存储两个字典中存在的所有值

unique_vals = []
new_dict = {}
for key in list(d1.keys())+list(d2.keys()) :
    unique_vals = []
    try:
        for val in d1[key]:
            try:
                for val1 in d2[key]:
                    if(val1 == val) and (val1 not in unique_vals):
                        unique_vals.append(val)
            except:
                continue
    except:        
        new_dict[key] = unique_vals
    new_dict[key] = unique_vals

然后,对于两个字典中未在此新字典中列出的每个值,这些值将附加到新字典中。

for key in d1.keys():
      for val in d1[key]:
          if val not in new_dict[key]:
              new_dict[key].append(val)
for key in d2.keys():
    for val in d2[key]:
        if val not in new_dict[key]:
            new_dict[key].append(val)

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    也许是defaultdict

    >>> d1 = {'a': 'a', 'b': 'b'} 
    >>> d2 = {'b': 'c', 'c': 'd'}
    >>> from collections import defaultdict                                         
    >>>                                                                             
    >>> merged = defaultdict(list)                                                  
    >>> dicts = [d1, d2]                                                            
    >>> for d in dicts: 
    ...:     for key, value in d.items(): 
    ...:         merged[key].append(value) 
    ...:                                                                            
    >>> merged                                                                      
    defaultdict(list, {'a': ['a'], 'b': ['b', 'c'], 'c': ['d']})
    

    这适用于dicts 列表中的任意数量的字典。

    作为一个函数:

    def merge_dicts(dicts):
        merged = defaultdict(list)
    
        for d in dicts:
            for key, value in d.items():
                merged[key].append(value)
    
        return merged
    

    【讨论】:

      【解决方案2】:

      这是一个更简单的版本:

      d1 = {'a': 'a', 'b': 'b'}
      d2 = {'b': 'c', 'c': 'd'}
      
      new_dict = {key: [value] for key, value in d1.items()}
      for key, value in d2.items():
          try:
              new_dict[key].append(value)
          except:
              new_dict[key] = [value]
      

      输出:

      {'a': ['a'], 'b': ['b', 'c'], 'c': ['d']}
      

      【讨论】:

      • 这和@actual_panda的方法一样,区别在于我没有在字典上创建循环,而是简单地写了2个forloops,因为你只有2个输入字典;我考虑到了第二个字典中存在键的可能性,而不是第一个带有 try/except 的键。
      • 谢谢!我刚刚意识到我还有另一个输入。实际上,我的输入如下: d1 = {'a': ['a'], 'b': ['b', 'c']} d2 = {'b': ['d'], 'c ': ['e','f']}
      • @aze45sq6d 然后将append 替换为extend 并从value 中删除括号,因为您的值已经列出;它会起作用的。
      【解决方案3】:

      编辑:以下解决方案适用于原始问题,请参阅其他答案或重复更新问题。

      单行解决方案:

      def merge_dicts(*dcts):
          return {k: [d[k] for d in dcts if k in d] for k in {k for d in dcts for k in d.keys()}}
      
      d1 = {'a': 'a', 'b': 'b'}
      d2 = {'b': 'c', 'c': 'd'}
      print(merge_dicts(d1, d2))
      # {'c': ['d'], 'a': ['a'], 'b': ['b', 'c']}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 2019-05-04
        • 2017-07-22
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        相关资源
        最近更新 更多