汉语维恩图的哈希或词典?

时间:2015-12-16 20:21:31

标签: python dictionary hash set union

我有两个字典(每个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)

但我无法弄清楚如何制作字典。

1 个答案:

答案 0 :(得分: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}