比较字典并将其合并。没有覆盖,没有重复的值

aze*_*q6d 7 python dictionary

我在这里的问题中犯了一个错误(错误的请求输入和预期输出): 比较字典,更新NOT覆盖值

不是在寻找这种解决方案: 将2个词典与通用密钥结合使用 因此这个问题不是重复的

问题陈述:

要求的输入:

d1 = {'a': ['a'], 'b': ['b', 'c']}
d2 = {'b': ['c', 'd'], 'c': ['e','f']}
Run Code Online (Sandbox Code Playgroud)

预期的输出(我不在乎键/值的顺序!):

new_dict = {'a': ['a'], 'b': ['b', 'c', 'd'], 'c': ['e', 'f']}
Run Code Online (Sandbox Code Playgroud)

将2个词典与公共密钥结合在一起的解决方案 给出以下输出:

new_dict = {'a': ['a'], 'b': ['b', 'c', 'c', 'd'], 'c': ['e', 'f']}
Run Code Online (Sandbox Code Playgroud)

我不希望重复项被存储。

我的解决方案(它可以工作,但效率不高):

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)
Run Code Online (Sandbox Code Playgroud)

Pan*_*shi 7

这是我的处理方法:

d1 = {'a': ['a'], 'b': ['b', 'c']}
d2 = {'b': ['c', 'd'], 'c': ['e','f']}
dd1 = {**d1, **d2}
dd2 = {**d2, **d1}
{k:list(set(dd1[k]).union(set(dd2[k]))) for k in dd1}
Run Code Online (Sandbox Code Playgroud)

产生所需的结果。

  • 这不适用于<3.5的python版本,对吗? (2认同)

Max*_*x V 5

我建议使用默认字典集合,并将集合作为默认值。它保证所有值都是唯一的,并使代码更简洁。

谈到效率,时间是 O(n^2)。

   from collections import defaultdict


   d1 = {'a': ['a'], 'b': ['b', 'c']}
   d2 = {'b': ['c', 'd'], 'c': ['e','f']}

   new_dict = defaultdict(set)

   for k, v in d1.items():
       new_dict[k] = new_dict[k].union(set(v))

   for k, v in d2.items():
       new_dict[k] = new_dict[k].union(set(v))

Run Code Online (Sandbox Code Playgroud)