【问题标题】:Python: Merge two dictionariesPython:合并两个字典
【发布时间】:2021-02-03 23:00:57
【问题描述】:

这是我当前的代码:

A = {1 : "one", 2 : "two"}
B = {2 : "dva", 3 : "three"}
d = {}

for key in set(list(A.keys()) + list(B.keys())):
    try:
        d.setdefault(key,[]).append(A[key])
    except KeyError:
        pass

    try:
        d.setdefault(key,[]).append(B[key])
    except KeyError:
        pass
print(d)

这是我目前得到的结果:

{1: ['one'], 2: ['two', 'dva'], 3: ['three']}

我必须做什么才能获得如下所示的结果?

{1 : "one", 2 : ["two", "dva"], 3 : "three"}

【问题讨论】:

  • 为什么你想要第二个结果?它似乎不太通用/更难使用。
  • 举例:如果原来的dicts 看起来像{1: ["one"], 2:["two"]},你的任务会容易得多。

标签: python python-3.x merge elementary


【解决方案1】:

您可以首先使用** 运算符创建一个新的dict

new_dict = {**A, **B}
>>> new_dict
{1: 'one', 2: 'dva', 3: 'three'}

然后在 set 键的交集上循环 for

>>> for dupe_key in set(A) & set(B):
...     new_dict[dupe_key] = [A[dupe_key], B[dupe_key]]
...
>>> new_dict
{1: 'one', 2: ['two', 'dva'], 3: 'three'}

【讨论】:

    【解决方案2】:

    此代码实现了您正在寻找的内容:

    A = {1 : "one", 2 : "two"}
    B = {2 : "dva", 3 : "three"}
    
    d = A.copy()
    for key, val in B.items():
        if key in d:
            if isinstance(d[key], list):
                d[key].append(val)
            else:
                d[key] = [d[key], val]
        else:
            d[key] = val
    
    print(d)
    

    但是,正如 cmets 中提到的,它的通用性较差,这意味着您必须每次都检查值的类型(更多的 if-else 检查)才能使用它。

    【讨论】:

      【解决方案3】:

      这里有一个快速的解决方案:

      A = {1 : "one", 2 : "two"}
      B = {2 : "dva", 3 : "three"}
      d = {**A}
      
      for k, v in B.items():
          d[k] = [d[k], v] if k in d else v
      
      print(d)
      

      输出:

      {1: 'one', 2: ['two', 'dva'], 3: 'three'}
      

      这是一个更通用的解决方案,适用于不限数量的字典:

      def cool_dict_merge(dicts_list):
          d = {**dicts_list[0]}
          for entry in dicts_list[1:]:
              for k, v in entry.items():
                  d[k] = ([d[k], v] if k in d and type(d[k]) != list
                          else [*d[k], v] if k in d
                          else v)
          return d
      

      测试:

      >>> A = {1: "one", 2: "two"}
      >>> B = {2: "dva", 3: "three"}
      >>> C = {2: "chewbacca", 3: "ThReE", 4: "four"}
      >>> D = {0: "zero", 4: "jack", 5: "five"}
      >>> cool_dict_merge([A, B, C, D])
      {1: 'one', 2: ['two', 'dva', 'chewbacca'], 3: ['three', 'ThReE'], 4: ['four', 'jack'], 0: 'zero', 5: 'five'}
      

      请注意,正如其他人指出的那样,您当前获得的结果在大多数情况下可能更可取,因为它更通用且更易于使用。不过,我们不了解您的用例,所以请使用您觉得最舒服的方法。

      【讨论】:

        【解决方案4】:

        我使用字典和 groupby 组来查找类似的数据集。 Pandas 非常适合将数据转换为字典、元组或列表。

        A = {1 : "one", 2 : "two"}
        B = {2 : "dva", 3 : "three"}
        
        z1=zip(A.keys(),A.values())
        z2=zip(B.keys(),B.values())
        
        mylist=[]
        mylist.append(list(z1))
        mylist.append(list(z2))
        
        variables=[]
        phrases=[]
        for item in mylist:
           for k,v in item:
               variables.append(k)
               phrases.append(v)
        df=pd.DataFrame(zip(variables,phrases),columns=['variable','phrase'])
        
        grpDictionary=df.groupby('variable').groups
        
        resultDictionary={}
        for key, values in grpDictionary.items():
            resultDictionary[key]=" ".join(df.iloc[values]['phrase'])
        
        print(resultDictionary)
        

        输出:

        {1: 'one', 2: 'two dva', 3: 'three'}
        

        【讨论】:

          猜你喜欢
          • 2013-11-02
          • 1970-01-01
          • 2022-12-26
          • 1970-01-01
          • 2019-05-16
          • 2019-07-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多