两个具有相同键的Python字典:如何检测值不匹配的键?

时间:2019-10-07 09:07:25

标签: python dictionary

用例

我有一些(大)文件,仅当它们已更改时才要在给定的站点上载。为此,我计划在Python(3)作为编程语言的情况下使用以下方案:

  1. 初始化
    • 感谢hashlib模块,我创建了一个字典,其中包括:
      • 作为键:文件名
      • 作为值:相应文件的哈希值,
    • 我将此字典写在专用文件中(例如hash_file.txt)。
  2. 下一步(文件可能已更改)
    • 感谢hashlib,我用以下方法创建了一个(新的)字典:
      • 作为键:与(旧)词典中的相同,即文件名,
      • 作为值:相应文件的(可能是新的)散列,
    • 我将这本新词典与hash_file.txt中的旧词典进行了比较,并上传了哈希不匹配的文件(对应于值不匹配的键)。
    • 我将hash_file.txt中的旧字典替换为新字典。

示例

带有以下新旧字典:

  • {"file_1":"foo1","file_2":"foo2","file_3":"foo3","file_4":"foo4"}
  • {"file_1":"foo1","file_2":"bar2","file_3":"foo3","file_4":"bar4"}

要检测的键将是"file_2""file_4"

问题

  • 有没有比这种情况更好的方法了?
  • 如果没有,什么是检测这两个字典中键值不匹配的最佳方法?

1 个答案:

答案 0 :(得分:2)

假设您不在乎一个字典中存在的键,而不关心另一个字典中存在的键,则可以执行以下操作:

d1 = {"file_1":"foo1","file_2":"foo2","file_3":"foo3","file_4":"foo4"}
d2 = {"file_1":"foo1","file_2":"bar2","file_3":"foo3","file_4":"bar4"}

non_matching = []

for k, v1 in d1.items():
  v2 = d2.get(k, v1)
  if v1 != v2:
    non_matching.append(k)

non_matching然后根据需要成为['file_2', 'file_4']


如果要做关心可能在一个而不是另一个中的键,我们需要考虑两个字典中键的并集。可以这样完成:

d1 = {"file_1":"foo1","file_2":"foo2","file_4":"foo4"}
d2 = {"file_1":"foo1","file_2":"bar2","file_3":"foo3"}

non_matching = []

shared_keys = set(d1.keys()).union(d2.keys())

for k in shared_keys:
  if d1.get(k, []) != d2.get(k, ()):
    non_matching.append(k)

这将使您['file_2', 'file_3', 'file_4']