假设
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'
注意:这里的每个列表都是从两个大文件中捕获的行,用于逐行比较,以便仅保存两个文件中唯一的行
答案 0 :(得分:0)
将每个内部字典变成一组元组,然后执行简单的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
如果要考虑两个以上的键值对,则要获得更通用的解决方案,请考虑构建一个冻结集:
def _to_set(d):
return {frozenset(tuple(v) for v in V.items()) for V in d}
其余的保持不变。