Python 2.7及以下:基于两字典差异生成目标字典的最优Pythonic方法
解决方案
嘿,在Python 2.7及以下版本里,最Pythonic的实现方式肯定是字典推导式结合集合优化(或者直接简单的列表筛选),既简洁又易读,完全符合你的需求。先上能直接跑的代码:
dic1 = {'a' : [3, 4, 5], 'b' : [0, 1, 2]} dic2 = {'a' : [3, 4, 5], 'b' : [8, 1, 2, 30], 'c' : [9, 8, 2]} # 先把dic1的列表转成集合,提升查找效率 dic1_sets = {key: set(values) for key, values in dic1.items()} # 生成目标字典dic3 dic3 = { key: [item for item in dic2_vals if item not in dic1_sets.get(key, set())] for key, dic2_vals in dic2.items() if len([item for item in dic2_vals if item not in dic1_sets.get(key, set())]) > 0 }
运行后dic3的结果就是你想要的:{'b': [8, 30], 'c': [9, 8, 2]}。
代码细节解释
- 为什么要转集合?因为集合的
in操作时间复杂度是O(1),而列表是O(n)——如果你的列表元素很多,这能明显提升运行速度。当然如果数据量很小,跳过这一步也没问题。 - 字典推导式里的逻辑:
- 遍历
dic2的每一个键值对 - 对每个键,用列表推导式筛选出
dic2对应列表里**不在dic1对应列表(或空集合,如果键不存在于dic1)**的元素 - 最后加了个判断,确保只有当筛选后的列表非空时,这个键才会被加入
dic3,避免出现带空列表的键。
- 遍历
更简洁的轻量版(适合小数据量)
如果你的数据规模不大,不想搞集合转来转去,也可以用这个更直白的写法,同样很Pythonic:
dic3 = {} for key, vals in dic2.items(): diff_list = [item for item in vals if item not in dic1.get(key, [])] if diff_list: dic3[key] = diff_list
这个版本代码更短,可读性也很强,唯一的缺点就是当列表很大时,item not in list的查找会慢一些——但日常用完全足够。
额外说明
- 这个方法会保留
dic2列表里元素的原始顺序,因为我们是按顺序遍历筛选的,这点和你的示例需求一致。 - 如果列表里有重复元素(比如
dic2['b'] = [8,8,1,2,30]),结果会保留重复项(比如[8,8,30]),这也符合“保留dic2中独有的内容”的逻辑。
内容的提问来源于stack exchange,提问作者rasonage
相关产品推荐
相关产品推荐

