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



用例

我有一些(大(文件,只有在它们发生变化时才想上传到给定的站点。为此,我计划使用以下方案,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".

问题

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

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

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']

最新更新