首页 > 解决方案 > 如何检查字典项目列表是否是子集或等于另一个具有字典项目的列表

问题描述

认为,

d1 = [{'id':'112','type':'address0'}, {'id':'113', 'type':'address0'}]  
d2 = [{'id':'112','type':'address0'}, {'id':'113', 'type':'address0'},{'id':'114', 'type':'address0'}] 
d3 = [{'id':'111','type':'address0'}, {'id':'113', 'type':'address0'}]   
d4 = [{'id':'112','type':'address0'}, {'id':'113', 'type':'address0'}]

测试结果:

test_subset(d1,d2) # True
test_subset(d3,d2) # False
test_subset(d1,d4) # True

尝试使用 时set(d1).issubset(d2),会看到脚本错误。

TypeError: unhashable type: 'dict'

注意:这里的每个列表都是从两个大文件中捕获的行,用于逐行比较,以便只保存两个文件中唯一的行

标签: python-2.7

解决方案


将每个内部 dict 转换为一组元组,然后执行简单的set子集检查。

感谢@AChampion 的简化。

def _to_set(d):
    return {(V['id'], V['type']) for V in d}

def test_subset(d1, d2):
    return set.issubset(*map(_to_set, [d1, d2]))

test_subset(d1,d2)
True

test_subset(d3,d2)
False

test_subset(d1,d4)
True

当您需要考虑两个以上的键值对时,对于更通用的解决方案,请考虑构建一个 freezeset:

def _to_set(d):
    return {frozenset(tuple(v) for v in V.items()) for V in d}

其余的保持不变。


推荐阅读