Python如何对比两个等长列表差异并生成原值映射新值的变更字典
问题说明
给定两个长度相同的列表,需要输出同位置下发生变更的原值到新值的映射字典:key为原列表中发生变更的元素,value为目标列表对应位置的新值。
你之前写的集合差集取差异的代码存在固有缺陷:集合会自动去重、元素无序,且完全丢失位置信息,无法实现原值到新值的对应匹配——比如示例里第二个列表的重复值4会被集合去重,根本识别不到索引3位置从8变为4的变更。另外你给出的示例变量名虽然带set后缀,但实际是列表类型,不要和Python原生的集合类型混淆。
实现方法
直接逐位配对两个列表同索引的元素,筛选出值不相等的配对,组装成字典即可,完全匹配你给出的示例效果。
基础易读写法
first_list = [1, 4, 6, 8, 9] sec_list = [1, 4, 5, 4, 9] change_dict = {} for old_val, new_val in zip(first_list, sec_list): if old_val != new_val: # 此处转str是为了匹配示例中key、value均为字符串的要求,不需要可去掉str()包裹 change_dict[str(old_val)] = str(new_val)
运行后得到的change_dict输出为{'6':'5', '8':'4'},和预期结果完全一致。
简洁推导式写法
change_dict = {str(old): str(new) for old, new in zip(first_list, sec_list) if old != new}
注意事项
- 上述实现基于题目给出的「两个列表长度相同」的前提,如果存在列表长度不一致的场景,
zip会默认以更短的列表长度为准截断配对,可以在逻辑前增加长度校验做异常处理。 - 如果原列表存在多个位置的同一个旧值对应不同新值的情况,字典会保留最后一次出现的配对,这是字典key唯一的固有特性。
内容的提问来源于stack exchange,提问作者Defqon
相关产品推荐
相关产品推荐

