繁体   English   中英

两个词典的交集和差异

[英]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?

你得到4KeyError ,因为^查找对称差异 ,这意味着两者都是唯一的密钥,密钥不在两者中。 您也不需要创建集合,可以使用从调用.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}

所有运算符都在python 文档中讨论, Set_(数学)上的wiki页面也为您提供了很好的概述。

这是一种方法,尽管可能有一种更有效的方法。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM