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'
注意:这里的每个列表都是从两个大文件中捕获的行,用于逐行比较,以便只保存两个文件中唯一的行
解决方案
将每个内部 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}
其余的保持不变。
推荐阅读
- python - 在 Bot 中获取用户的输入
- javascript - 使用 !important 时 gulp-less 失败
- c# - 如何将 AspNetUser 表存储在某个 SQL 数据库中?
- angular - Angular Elements - 未捕获的类型错误:无法构造“HTMLElement”
- python - 哪种数据结构用于具有共同属性的快速变化的对象?
- database - InfluxDB 显示特定列的 FieldKey
- deep-linking - 如何深度链接到 Glip 团队?
- php - 每次将数据插入依赖 FOREIGN KEY 的 MySQL 表时,是否需要执行额外的 SELECT 和 INSERT IGNORE 查询?
- javascript - Polymer 在 3 秒内输入后忽略鼠标点击
- html - D3.js 与 Boostrap 冲突