如何用Python对比不同长度字典的values并输出不匹配项?
问题:对比两个不同长度字典的SHA值,找出不匹配的键值对
需要对比本地电脑与NAS上文件的SHA值(存储在两个长度不同的字典中),找出并输出不匹配的键值对用于后续处理。
示例字典
x = {'C:\\test\\1\\123.zip': 'df029a659e13fb455aa3d39079caf4e52e2fcd30', 'C:\\test\\1\\lalala.zip': '45cef0d73b817a890183227c88719af99e68ec47'} y = {'/var/data/123.zip': 'df029a659e13fb455aa3d39079caf4e52e2fcd30', '/var/data/234.zip': '41b845d81c0c0b4510e356c26206d0f9b118285d', '/var/data/345.zip': 'dba1f5a7c1c34327ee261f95b58804ceae5c3577'}
期望输出
'C:\test\1\lalala.zip': '45cef0d73b817a890183227c88719af99e68ec47' - differ
现有代码的问题
现有代码通过**键(文件路径)**匹配两个字典,但本地和NAS的文件路径完全不同,k in y永远为False,无法找到任何匹配项;同时逻辑只检查键存在且值不同的情况,完全不符合通过SHA值匹配的需求:
shared_items = {k: x[k] for k in x if k in y and x[k] != y[k]} print(shared_items)
解决方案
核心思路是通过SHA值(字典的值)建立两个字典的关联,相同SHA值代表是同一个文件。具体步骤:
- 将NAS的字典
y转换为反向映射:键为SHA值,值为对应的NAS文件路径,方便快速查找SHA是否存在 - 遍历本地字典
x的每一组键值对,检查当前SHA值是否存在于反向映射中:- 若不存在,说明该本地文件在NAS上没有匹配的SHA,标记为不匹配项
- 若存在,说明两边有相同文件,跳过
代码实现
# 构建NAS字典的反向映射:SHA值 -> 文件路径 y_sha_map = {sha: path for path, sha in y.items()} # 遍历本地字典,找出不匹配项 for local_path, local_sha in x.items(): if local_sha not in y_sha_map: print(f"'{local_path}': '{local_sha}' - differ")
运行结果
'C:\test\1\lalala.zip': '45cef0d73b817a890183227c88719af99e68ec47' - differ
内容的提问来源于stack exchange,提问作者Леонид
相关产品推荐
相关产品推荐

