如何检查字典项列表是子目录还是等于具有字典项的另一个列表

时间:2018-08-29 19:51:28

标签: 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'}]   
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'

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

1 个答案:

答案 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}

其余的保持不变。