【问题标题】:Hashing or dictionaries for Venn diagram of dictionaries?字典的维恩图的散列或字典?
【发布时间】:2015-12-16 20:21:30
【问题描述】:

我有两个格式相同的字典(每个 80K 条目):

A= {'1':'a', '2':'b', '3':'c', '4':'d'}

B= {'2':'b', '3':'a', '4':'d', '5':'e'}

Dict_A 中的一些键:值对与 Dict_B 重叠。把这些字典想象成维恩图圈。我的目标是找到这两个字典的重叠部分并生成新字典:Dict_A、Dict_B、Dict_C 和 Dict_D。 我想最终得到 6 个字典:

原版词典:

A= {'1':'a', '2':'b', '3':'c', '4':'d'}
B= {'2':'b', '3':'a', '4':'d', '5':'e'}

Dict_A:具有 A 唯一键的项目

Dict_A = {'1':'a'}

Dict_B:具有 B 唯一键的项目

Dict_B = {'5':'e'}

Dict_C:A 和 B 共享键但值不同的项

Dict_C = {'3':'a', '3':'c'}

Dict_D:具有由 A 和 B 共享的键和值的项目。

Dict_D = {'2':'b', '4':'d'}

我知道如何通过设置它们来找到这些东西的长度:

shared1 = set(A.items()) & set(B.items())

shared2 = set(A.keys()) & set(B.keys())

然后我可以找出 Dict_C 中应该有多少: len(shared2) - len(shared1)

但我不知道如何让它们成为字典。

【问题讨论】:

  • 键必须是唯一的
  • Dict_C 不会发生,除非您附加到容器
  • 除了@depperm 所说的,如果两个字典的键值映射集保持不变,那么最好将它们表示为列表。此时,您可以轻松使用列表推导。
  • 啊是的.. 我只需要制作两个字典 C1 和 C2,它们的项目数完全相同,键相同,值不同。

标签: python dictionary hash set union


【解决方案1】:

由于字典查找时间很快(O(1),您可以使用字典理解:

>>> # use iteritems on Python2
>>> shared1 = {k: v for k, v in A.items() if i in B}

Dict_A:具有 A 唯一键的项目

Dict_B:具有 B 唯一键的项目

>>> Dict_A = {k: v for k,v in A.items() if k not in B}
>>> Dict_B = {k: v for k,v in B.items() if k not in A}

用于您以后的任务,例如:

Dict_C:A 和 B 共享键但值不同的项

您可以使用列表推导:

>>> # use iteritems for Python2
>>> # list comprehension
>>> shared1 = [k for k, v in A.items() if B.get(k) == v]
>>> # set comprehension
>>> shared1 = {k for k, v in A.items() if B.get(k) == v}

请记住,键必须是唯一的,并且您只需要不同的 :列表(或集合)就足够了(使用花括号或集合推导来生成集合)。

Dict_D:A 和 B 共享键和值的项目。

只要使用与上面相同的想法

>>> Dict_D = {k: v for k, v in A.items() if B.get(k) == v}

【讨论】:

  • 这是一个几乎完美的答案。我最终为 Dict_C 制作了两个字典 - dictC_a 和 dictC_b,但效果很好。非常感谢。随着我使用python的越来越多,这个肯定会越来越多地使用。
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 2020-09-05
  • 2010-11-12
  • 2020-11-08
  • 2013-12-05
  • 2021-05-08
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多