You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:05:22