考虑到两个字典,我想看看它们的相互作用和差异,并对相交的元素执行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?
答案 0 :(得分:2)
你得到 4 的 KeyError ,因为^
会查找对称差异,这意味着键的唯一键 ,键不在中。您也不需要创建集,可以使用从调用.keys
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}