基于值比较合并python词典

时间:2017-11-22 08:23:36

标签: python

我有两个dictionaries

dict1 = {'key1': [val, val, val], 'key2': [val, val, val]}
dict2 = {'key1': [val, val, val], 'key2': [val, val, val]}

我需要在dict1dict2个键中找到相同的值,并使用这些键创建一个新的dictdicr3 = {'key1': key1})。有没有更好的方法来做这个而不是双for循环?

for key, val in first_dict.items():
    for key2, val2 in sec_dict.items():
        if val == val2:
            print(str(key) + " : " + str(key2))

3 个答案:

答案 0 :(得分:2)

您可以将值转换为元组。通过这种方式,它们变得可以清洗,你可以把它们变成一个字典:

dict1 = {'key1': [1,2,3], 'key2': [3,4,5]}
dict2 = {'key3': [2,3,4], 'key4': [1,2,3]}

same_lists = {}

for d in [dict1, dict2]:
    for k, v in d.items():
        same_lists.setdefault(tuple(v), []).append(k)

print(same_lists)
# {(1, 2, 3): ['key1', 'key4'], (3, 4, 5): ['key2'], (2, 3, 4): ['key3']}

现在你只需要遍历你的dict的值并寻找多个键:

for common_keys in same_lists.values():
    if len(common_keys) > 1:
        print(common_keys)
# ['key1', 'key4']

与您的O(n)代码相比,此解决方案为O(n**2)

答案 1 :(得分:1)

这个怎么样:

{key1: key2 for key1, value1 in dict1.items() for key2, value2 in dict2.items() if value1 == value2}

答案 2 :(得分:0)

  

有更好的方法来做这个而不是双循环吗?

是的,您可以使用zip功能。

dict1 = {'key1': [1, 2, 3], 'key2': [4, 5, 6]}
dict2 = {'key1': [4, 5, 6], 'key2': [7, 8, 9]}
for k1, k2 in zip(dict1, dict2):
  pass

目前还不清楚你想要实现的合并操作,因此我会让你处理自己的情况,但设置是执行合并操作的好方法。