两个词典的交集和差异

时间:2016-10-01 10:00:23

标签: python dictionary

考虑到两个字典,我想看看它们的相互作用和差异,并对相交的元素执行f函数并对唯一元素执行g,这就是我如何找到d1和d2所在的唯一和相交元素的位置两个字典,如何在元组中打印出d_intersection和d_difference作为字典?输出应该看起来像这样({intersecting keys,values},{difference keys,values}) 例如:给定

d1 = {1:30, 2:20, 3:30, 5:80}

d2 = {1:40, 2:50, 3:60, 4:70, 6:90}

输出应为({1: 70, 2: 70, 3: 90}, {4: 70, 5: 80, 6: 90})

dic = {}
d_intersect = set(d1) & set(d2)
d_difference =  set(d1) ^ set(d2)
for i in d_intersect:
    dic.update({i : f(d1[i],d2[i])})
for j in d_difference:
    dic.update({j : g(d1[j],d2[j])})

有人可以告诉我哪里出错了,为什么我的代码会给出错误4?

2 个答案:

答案 0 :(得分:2)

你得到 4 KeyError ,因为^会查找对称差异,这意味着键的唯一键 ,键不在中。您也不需要创建集,可以使用从调用.keys

返回的view object
d1 = {1: 30, 2: 20, 3: 30, 5: 80}

d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90}

 # d1.keys() ^ d2 -> {4, 5, 6}, 4, 6 unique to d2, 5 unique to d1.
symm = {k: d1.get(k, d2.get(k)) for k in d1.keys() ^ d2}
inter = {k: d2[k] + d1[k] for k in d1.keys() & d2}
当我们从d1.get(k, d2.get(k))获取唯一键时,

d2适用于对称差异

python2的代码略有不同,您需要将.keys替换为.viewkeys才能获得view object:

 {k: d1.get(k, d2.get(k)) for k in d1.viewkeys() ^ d2}
 {k: d2[k] + d1[k]  for k in d1.viewkeys() & d2}

为了得到两组之间的差异,即a中的但不是b中的内容,你需要-

In [1]: d1 = {1: 30, 2: 20, 3: 30, 5: 80}

In [2]: d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90}

In [3]: {k: d2[k] for k in d2.keys() - d1}
Out[3]: {4: 70, 6: 90}

In [4]: {k: d1[k] for k in d1.keys() - d2}
Out[4]: {5: 80}
In [5]: d2.keys() - d1 # in d2 not in d1
Out[5]: {4, 6}

In [6]: d1.keys() - d2 # in d1 not in d2
Out[6]: {5}

In [7]: d1.keys() ^ d2 # unique to either
Out[7]: {4, 5, 6}

对称差异就像做差异的结合:

In [12]: d1.keys() - d2 |  d2.keys() - d1
Out[12]: {4, 5, 6}

所有运算符都在python docs中讨论,Set_(mathematics)上的wiki页面也为您提供了一个很好的概述。

答案 1 :(得分:1)

这是实现目标的一种方式,尽管可能有更有效的方法。

d1 = {1:30, 2:20, 3:30, 5:80}
d2 = {1:40, 2:50, 3:60, 4:70, 6:90}

d_intersect = {} # Keys that appear in both dictionaries.
d_difference = {} # Unique keys that appear in only one dictionary.

# Get all keys from both dictionaries.
# Convert it into a set so that we don't loop through duplicate keys.
all_keys = set(d1.keys() + d2.keys()) # Python2.7
#all_keys = set(list(d1.keys()) + list(d2.keys())) # Python3.3

for key in all_keys:
    if key in d1 and key in d2:
        # If the key appears in both dictionaries, add both values
        # together and place it in intersect.
        d_intersect[key] = d1[key] + d2[key]
    else:
        # Otherwise find out the dictionary it comes from and place
        # it in difference.
        if key in d1:
            d_difference[key] = d1[key]
        else:
            d_difference[key] = d2[key]
  

输出:

     

{1:70,2:70,3:90}

     

{4:70,5:80,6:90}