2016-10-01 57 views
1

给定两个字典,我想看看他们的差异和差异,并执行f元素相交和独特的元素执行g,以下是我如何找出独特和相交元素是哪里d1和d2是两个字典,我如何打印出d_intersection和d_difference作为元组内的字典?输出应该是这个样子({交叉键,值},{差异键,值}) 例如:给定两个字典的相交和差异

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?

+1

一个建议:你的问题很混乱,不容易理解,代码看起来很奇怪。那是什么编程语言?当你说你期望某个输出,但你不提供输入时,几乎不可能理解你要找的东西。 – Andry

+0

对不起,现在就编辑它。它的python和一个测验问题之一,我试图解决它。我对python非常陌生,所以我的代码看起来非常难看 – user6820366

+0

从输出看起来你想要一个包含两个字典的元组。函数dict_interdif给出一个单独的字典。 –

回答

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] 

Output:

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

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

+1

您是否也可以解释代码是如何工作的,我知道它有点太多了,但我真的很想知道这段代码是如何工作的,所以我可以根据您的代码创建自己的代码。谢谢。 – user6820366

+0

当然,我会加入评论。 –

+0

非常感谢! 行all_keys =集(d1.keys()+ d2.keys()) 给出了一个错误 类型错误:不支持的操作数类型(S)为+: 'dict_keys' 和 'dict_keys' – user6820366

2

你得到一个KeyError异常为为^将查找对称差这意味着键独特要么,键两者。你也不需要创建集,您可以使用返回的view object从主叫.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代码稍有不同,你需要用.viewkeys更换.keys获得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} 

拿到两个集之间的仅仅是差异,即什么是在一个,但不是在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页面也给出了一个很好的概述。

+0

所以对称差异仅在两个字典中都不存在时才会捕获值,但只有一个?我想要这两个字典中的任何元素都不存在于另一个字典中。就像{5:80}不存在于d2中一样,我也想要类似的想法{4:70,6:90},因为它们不存在于d1中。我可以研究这些集合和集合的交集的好来源吗?感谢您回答btw – user6820366

+0

@ user6820366,两组的对称差异将包含来自任一组的独特元素。我添加了一些更多的例子。 –

+0

我明白了,这是有道理的,对称差异是每个词典中键的差异的联合。谢谢,这是非常丰富的:D – user6820366