Python 2.7 如何检查一个dict项目列表是否是另一个dict项目列表的子集或等于另一个dict项目列表
假设Python 2.7 如何检查一个dict项目列表是否是另一个dict项目列表的子集或等于另一个dict项目列表,python-2.7,Python 2.7,假设 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'}]
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'
注意:这里的每个列表都是从两个大文件中捕获的行,用于逐行比较,以便只保存两个文件中唯一的行将每个内部dict转换为一组元组,然后执行简单的
集合
子集检查
感谢@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]))
对于一个更一般化的解决方案,当您有两个以上的键值对要考虑时,考虑建立一个FROZSENSET代替:
def _to_set(d):
return {frozenset(tuple(v) for v in V.items()) for V in d}
其余部分保持不变。您需要比较的不仅仅是
id
?不,还需要考虑“type”值。您可以保证id
和value
在Py2.7中总是以相同的顺序出现V.items()
?或者,{(V['id'],V['value'])在d}
中为V工作。@AChampion-Hmm,我们不保证python2中(k:V)对的元组与dict.items一起工作吗?或者可能我误解了。是的,忽略-我在严格考虑元组
def _to_set(d):
return {frozenset(tuple(v) for v in V.items()) for V in d}