我有两个字典(每个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)
但我无法弄清楚如何制作字典。
答案 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}