Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何检查一个dict项目列表是否是另一个dict项目列表的子集或等于另一个dict项目列表_Python 2.7 - Fatal编程技术网

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}