[英]Intersection and Difference of two dictionaries
给定两个字典,我想看看它们的间隔和差异,并对相交的元素执行f函数并对独特元素执行g,这就是我如何找出d1和d2是两个字典的唯一和交叉元素,如何在元组中打印出d_intersection和d_difference作为字典? 输出应该看起来像这样({intersecting keys,values},{difference keys,values}),例如:given
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?
你得到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
得到一个视图对象 :
{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}
这是一种方法,尽管可能有一种更有效的方法。
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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.