python - Python:比较字典中键之间的值重叠
问题描述
我有一个dict
这样的:
dict = defaultdict(list, {'a': [['1', '2', 'A', 'cat'],
['1', '3', 'A', 'dog']],
'b': [['1', '2', 'A', 'cat'],
['1', '3', 'A', 'dog']],
'c': [['1', '2', 'A', 'cat'],
['2', '2', 'A', 'snake'],
['2', '2', 'A', 'bird']]}
我想使用每个值的完整列表来获取重叠值的所有成对比较。(值列表中的每个位置都必须匹配才能被视为键之间的匹配)
既然a
和b
分享['1', '3', 'A', 'dog']
和c
不,a/b: ['1', '3', 'A', 'dog']
。
a
, b
, c
, 全部分享['1', '2', 'A', 'cat']
, a/b/c: ['1', '2', 'A', 'cat']
.
只有c
,['2', '2', 'A', 'snake']
所以c: ['2', '2', 'A', 'snake']
首选输出是结合上述内容的字典,例如
combine_dict = {'a/b': ['1', '3', 'A', 'dog'], 'a/b/c': ['1', '2', 'A', 'cat'], 'c': [['2', '2', 'A', 'snake'], ['2', '2', 'A', 'bird']]}
解决方案
您可以使用collections.defaultdict
:
import collections
d = {'a': [['1', '2', 'A', 'cat'], ['1', '3', 'A', 'dog']], 'b': [['1', '2', 'A', 'cat'], ['1', '3', 'A', 'dog']], 'c': [['1', '2', 'A', 'cat'], ['2', '2', 'A', 'snake'], ['2', '2', 'A', 'bird']]}
new_d = collections.defaultdict(list)
for a, b in d.items():
for i in b:
new_d[tuple(i)].append(a)
new_r = collections.defaultdict(list)
for a, b in new_d.items():
new_r['/'.join(b)].append(list(a))
new_result = {a:b[0] if len(b) == 1 else b for a, b in new_r.items()}
输出:
{'a/b/c': ['1', '2', 'A', 'cat'], 'a/b': ['1', '3', 'A', 'dog'], 'c': [['2', '2', 'A', 'snake'], ['2', '2', 'A', 'bird']]}
推荐阅读
- markdown - Markdown 列表缩进有 3 个空格还是 4 个空格?标准是什么?
- html - 如何使用 angular renderer2 将 mat-icon 动态添加到 div?
- promise - 在量角器中链接类似的承诺歧义
- php - 使用 Codeigniter 获取数据库记录
- reactjs - 在无状态子组件中测试父方法
- php - Codeigniter Hooks - post_controller_constructor 不工作
- java - 模式注释不适用于 Java 中的业务模型
- design-patterns - 聚合内部的实体可以在聚合外部访问或可见吗?
- node.js - Mongoose:CastError:模型的路径“_id”处的值“”转换为 ObjectId 失败
- polymer - 如何替换元素标签中的文本?