Python按指定Key对比字典列表,提取旧列表独有的字典项
解决方法
先说说你原来代码的问题:
- 遍历
old时直接调用remove会打乱列表迭代顺序,导致部分元素被跳过 x['key1'] in y['key1']是判断字符串包含关系,不是判断两个key值相等,逻辑本身就错了
正确的思路是先把新列表里所有key1的值提取出来存成集合(集合查找效率远高于列表),再从旧列表里筛选出key1不在这个集合里的项:
方法一:列表推导式(简洁高效)
old = [{'key1': 'AAA', 'key2': 'value2', 'key3': 'value3'},{'key1': 'BBB', 'key2': 'value4', 'key3': 'value5'},{'key1': 'CCC', 'key2': 'value4', 'key3': 'value5'}] new = [{'key1': 'BBB', 'key2': 'value2', 'key3': 'value3'},{'key1': 'CCC', 'key2': 'value4', 'key3': 'value1'}] # 提取new中所有key1的值到集合 new_keys = {item['key1'] for item in new} # 筛选old中key1不在new_keys里的项 result = [item for item in old if item['key1'] not in new_keys] print(result) # 输出: [{'key1': 'AAA', 'key2': 'value2', 'key3': 'value3'}]
方法二:普通循环(适合新手理解)
如果觉得列表推导式太紧凑,也可以用普通循环实现,注意不要直接修改原列表,而是新建列表存储结果:
old = [{'key1': 'AAA', 'key2': 'value2', 'key3': 'value3'},{'key1': 'BBB', 'key2': 'value4', 'key3': 'value5'},{'key1': 'CCC', 'key2': 'value4', 'key3': 'value5'}] new = [{'key1': 'BBB', 'key2': 'value2', 'key3': 'value3'},{'key1': 'CCC', 'key2': 'value4', 'key3': 'value1'}] new_keys = set() for item in new: new_keys.add(item['key1']) result = [] for item in old: if item['key1'] not in new_keys: result.append(item) print(result) # 输出和上面一致
这两种方法不管两个列表长度差多少都能正常工作,而且效率比你原来的嵌套循环高很多(嵌套循环时间复杂度是O(n*m),这种方法是O(n+m))。
内容的提问来源于stack exchange,提问作者Road Rangers
相关产品推荐
相关产品推荐

