用例
我有一些(大(文件,只有在它们发生变化时才想上传到给定的站点。为此,我计划使用以下方案,Python(3)
作为编程语言:
-
初始化
- 多亏
hashlib
模块,我创建了一个字典:- 作为键:文件名,
- 作为值:相应文件的哈希,
- 我把这本字典写在一个专用文件中(比如
hash_file.txt
(。
- 多亏
-
后续步骤(当文件可能已更改时(
- 多亏了
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']