python - 比较元组和列表的字典
问题描述
我找到了多篇关于这个主题的帖子(这个也是),但这些选项都不适用于我的字典。我想比较我的字典并知道相同的值的数量以及每个字典唯一的键值对。
我正在使用两个字典,其中元组作为键,列表作为值(第二个值是另一个列表),如下所示:
Dict1:{(10, 11): ['C', ['T']],
(20, 21): ['C', ['T']],
(34, 35): ['G', ['A']],
(68, 69): ['A', ['T','G']]}
Dict2:{(10, 11): ['C', ['T']],
(20, 21): ['C', ['A']],
(40, 41): ['T', ['G']],
(68, 69): ['A', ['T','G']]}
我想比较那些字典并有不同的输出。使用我的示例,这就是我想要的变量:
- 2个值相同并且存在于两个字典中
- 2 个值仅在 dict1 中
- 2 个值仅在 dict2 中
我正要遍历 dict1 并每次将每个键与所有 dict2 进行比较(并且每次满足条件时我都会更新变量),但我知道这可能不是最有效的方法。
有人有更快的想法吗?
谢谢
解决方案
您可以先使用 过滤掉密钥set-like methods of dict.keys() objects
,然后继续获取对:
>>> same_keys = Dict1.keys() & Dict2.keys()
>>> dict1_unq_keys = Dict1.keys() - Dict2.keys()
>>> dict2_unq_keys = Dict2.keys() - Dict1.keys()
>>> same_pairs = [(key, Dict1[key]) for key in same_keys if Dict1[key] == Dict2[key]]
>>> Dict1_unq_pair = [(key, Dict1[key]) for key in dict1_unq_keys]
>>> Dict2_unq_pair = [(key, Dict2[key]) for key in dict2_unq_keys]
>>> same_pairs
[((68, 69), ['A', ['T', 'G']]), ((10, 11), ['C', ['T']])]
>>> Dict1_unq_pair
[((34, 35), ['G', ['A']])]
>>> Dict2_unq_pair
[((40, 41), ['T', ['G']])]
笔记:
如果您可以使用tuples
asdict
值而不是lists
,则可以通过直接使用dict.items()
set 操作来获得相同的对来更轻松地完成此操作。
例如,如果Dict1
和Dict2
是以下形式:
>>> Dict1
{(10, 11): ('C', ('T',)),
(20, 21): ('C', ('T',)),
(34, 35): ('G', ('A',)),
(68, 69): ('A', ('T', 'G'))}
>>> Dict2
{(10, 11): ('C', ('T',)),
(20, 21): ('C', ('A',)),
(40, 41): ('T', ('G',)),
(68, 69): ('A', ('T', 'G'))}
# Then you could simple do:
>>> same_pairs = list(Dict1.items() & Dict2.items())
>>> same_pairs
[((68, 69), ('A', ('T', 'G'))), ((10, 11), ('C', ('T',)))]
推荐阅读
- android - IBM Watson 未经授权
- node.js - 在 localhost 上调试 firebase 函数错误:找不到模块
- algorithm - 自下而上 SLR(1) 冲突 / 两者都适用时减少
- android - Xamarin Android 连接到现有的 Wi-Fi AP
- c++ - 如何从文件中读取 Unicode 字符(非英语语言),这样我就可以拒绝诅咒词 [C++]?
- python - 在python中为大类别选择正确的绘图图面临困难
- java - MockServer 作为 Socks 代理不能与 curl 一起使用
- php - Laravel 5,如何在控制器中选中复选框
- html - 如何在ul li标签上制作悬停效果
- javascript - 类型错误:slides.forEach 不是函数