【问题标题】:Comparing dictionaries of tuples and lists比较元组和列表的字典
【发布时间】:2021-02-26 10:32:53
【问题描述】:

我找到了多个与此主题有关的posts(也有此one),但这些选项都不适用于我的字典。我想比较我的字典并知道相同的值的数量以及每个字典唯一的键值对。

我正在使用两个字典,其中元组作为键,列表作为值(其中第二个值是另一个列表),如下所示:

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 进行比较(并且每次满足条件时我都会更新变量)但我知道这可能不是最有效的方法它。

有人有更快的想法吗?

谢谢

【问题讨论】:

  • 唯一值是指唯一的key-value 对吗?独特的keys? r 唯一的 values
  • 唯一键值对对不起!更新帖子谢谢

标签: python dictionary compare


【解决方案1】:

您可以先使用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 作为dict 值而不是lists,这可以更容易地完成,直接使用dict.items() 设置操作来获得相同的对。

例如,如果 Dict1Dict2 具有以下形式:

>>> 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',)))]

【讨论】:

  • 非常感谢。我确实按照建议用元组更改了我的字典,并且效果很好。但是,如果我想使用第二种方法获得 dict 1 独有的对,我确实尝试编写类似的东西但没有成功OnlyDict1 = list(dict1.items() & not in dict2.items())
  • 你可以试试dict1.items() - dict2.items(),这将给出dict1独有的对。然而,尽管这对可能是唯一的,但由于键不同,它们也将是唯一的,并且可能具有相同的值。如果您想要键和值都是唯一的对,则需要使用dict1.keys() - dict2.keys() 来获取键,然后在循环中找到它们的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多