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

如何比较两个列表数据集并生成含缺失项的新数据集?

解决字典集合操作的TypeError问题

嘿,我懂你碰到的麻烦了——直接把字典丢进集合里做差集肯定会报错,因为字典是不可哈希的可变类型,而集合要求元素必须是可哈希的(像字符串、整数、元组这种不可变类型才符合要求)。那怎么实现你想要的「找出lis2里不在lis1中的元素」需求呢?下面给你几个实用的解决方案:

方案1:把字典转成可哈希的元组再操作

如果你的目标是找出lis2中完整字典不在lis1里的项,可以把每个字典转换成包含键值对的排序元组(保证相同内容的字典转成一致的元组),再用集合操作:

lis1 = [{'a':'1','b':'2','c':'3','d':'4','e':'5'}]
lis2 = [{'a':'1','b':'2'}]

# 将字典转为排序的键值对元组,确保相同内容的字典生成相同元组
set1 = set(tuple(sorted(d.items())) for d in lis1)
set2 = set(tuple(sorted(d.items())) for d in lis2)

# 计算差集后再转回字典格式
lis3 = [dict(items) for items in set2 - set1]
print(lis3)  # 输出: [{'a': '1', 'b': '2'}]

方案2:遍历判断(直观易懂,适合小数据集)

如果你的数据集规模不大,直接遍历lis2的每个元素,判断它是否不在lis1里就行:

lis1 = [{'a':'1','b':'2','c':'3','d':'4','e':'5'}]
lis2 = [{'a':'1','b':'2'}]

lis3 = [d for d in lis2 if d not in lis1]
print(lis3)  # 输出: [{'a': '1', 'b': '2'}]

这个方法的原理是Python会自动逐个比较字典的键值对是否完全一致,所以可以直接用in来判断归属。

补充:如果要找键值对的差异

要是你的需求不是找完整字典的差异,而是找lis2字典里有但lis1对应字典里没有的键值对,可以这么做:

# 假设lis1和lis2里的字典按对应位置比较
diff = []
for d1, d2 in zip(lis1, lis2):
    # 找出d2中存在但d1中没有,或者值不匹配的键值对
    missing = {k: v for k, v in d2.items() if k not in d1 or d1[k] != v}
    if missing:
        diff.append(missing)
print(diff)  # 输出: [] (本例中d2的键值对d1都包含,所以结果为空)

内容的提问来源于stack exchange,提问作者Ehsan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:41:46