【问题标题】:Understanding intersect and difference of dictionaries in python了解python中字典的相交和差异
【发布时间】:2016-05-28 02:55:34
【问题描述】:

我是 python 新手,遇到了这个问题,因为英语不是我的母语,所以我在解决这个问题时遇到了一些麻烦,但我写了我的代码,因为我从这个问题中了解到,任何人都可以判断我是否正确如果不是,请改进我的代码或提供您的代码

假设您有两个字典 d1 和 d2,每个字典都有整数键和整数值。还给你一个函数 f,它接受两个整数,对它们执行未知操作,然后返回一个值。

编写一个名为 dict_interdiff 的函数,它接收两个字典(d1 和 d2)。该函数将返回两个字典的元组:d1和d2相交的字典和d1和d2差的字典,计算如下:

'''Intersect:相交字典的键 是 d1 和 d2 中通用的键。 要获取相交字典的值, 查看 d1 和 d2 中的公共键并应用 这些键的值的函数——值 d1 中的公共密钥的第一个参数是 d2中的函数和公共键的值 是函数的第二个参数。 不要在你的 dict_interdiff 代码中实现 f —— 假设它是在外部定义的。

差异:差异字典中的键值对是 (a) 每个键值对 在 d1 中,其密钥仅出现在 d1 中而不出现在 d2 中或 (b) 每个 d2 中的键值对 键只出现在 d2 中,而不出现在 d1 中。'''

这里有两个例子:*

'''If f(a, b) returns a + b
d1 = {1:30, 2:20, 3:30, 5:80}
d2 = {1:40, 2:50, 3:60, 4:70, 6:90}
then dict_interdiff(d1, d2) 
returns ({1: 70, 2: 70, 3: 90}, {4: 70, 5: 80, 6: 90})


If f(a, b) returns a > b
d1 = {1:30, 2:20, 3:30}
d2 = {1:40, 2:50, 3:60}
then dict_interdiff(d1, d2)
returns ({1: False, 2: False, 3: False}, {})'''

这是我的代码:

def dict_interdiff(d1, d2):

a=d1.keys()
b=d2.keys()
c=d1.values()
d=d2.values()
e=()
u={}
f=[]
g=[]
for i in range(max(a,b)):
    if a[i]==b[i]:
        u=f(a[i],b[i])
    elif a[i] not in b:
         t=c.find(a[i])
         f.append(c[t])
         g.append(a[i])
         k=dict(zip(g,f))
    elif b[i] not in a:
         t=c.find(b[i])
         f.append(d[t])
         g.append(b[i])
         k=dict(zip(g,f))
    e+(u,)+(k,)
return e    

此外,我无法检查我的代码,因为它假定 f 已定义但我不知道,因此无法在我的解释器中运行

【问题讨论】:

  • 我刚刚定义了f:def f(a, b): return a + b,但是没有用:Traceback (most recent call last): File "test.py", line 30, in <module> print(dict_interdiff({1:30, 2:20, 3:30, 5:80}, {1:40, 2:50, 3:60, 4:70, 6:90})) File "test.py", line 14, in dict_interdiff for i in range(max(a,b)): TypeError: range() integer end argument expected, got list.
  • @zondo 你能改进我的代码还是给你的解决方案
  • 我想我做不到。我试图通过说max(len(a), len(b)) 而不是max(a, b) 来解决这个问题,但我又遇到了另一个我不知道如何解决的错误。
  • 您正在查看这些字典,就好像它们是数组一样,这不是一个有用的方法。字典是散列 - 键和相关值。考虑这些键可能是 ANYTHING 而不是整数,您可以看到访问器失败的原因。请参阅下面的示例解决方案...
  • 如果你想要来自 a 和 b 的唯一密钥,区别在于对称差异

标签: python python-2.7


【解决方案1】:

您始终可以通过在文件中自己定义代码来检查您的代码。这是我的简单实现:

def dict_interdiff(d1, d2):
'''
d1, d2: dicts whose keys and values are integers
Returns a tuple of dictionaries according to the instructions above
'''
# Your code here
orderedintersect={}
ordereddiff={}
done=d1.copy()
dtwo=d2.copy()
for key in done:
    if key in dtwo:
        orderedintersect[key]=f(done[key],dtwo[key])
        del d1[key]
        del d2[key]
d1.update(d2)
for i in sorted(d1.keys()):
    ordereddiff[i]=d1[i]
return orderedintersect,ordereddiff   

def f(a,b):
    return a+b    

【讨论】:

    【解决方案2】:

    您可以在字典上使用集合操作来完成这一切:

    def dict_interdiff(d1, d2):
        # symmetric difference, keys in either d1 or d2 but not both.
        sym_diff = d1.viewkeys() ^ d2
        # intersection, keys that are common to both d1 and d2.
        intersect = d1.viewkeys() & d2
        # apply f on values of the keys that common to both dicts.
        a = {k: f(d1[k], d2[k]) for k in intersect}
        b = {k: d1[k] for k in sym_diff & d1.viewkeys()}
        # add key/value pairings from d2 using keys that appear in sym_diff 
        b.update({k: d2[k] for k in sym_diff & d2.viewkeys()})
        return a,b
    

    sym_diff = d1.viewkeys() ^ d2 获取Symmetric_difference 即在任一 a 或b 但不在两者中的键。

    intersect = d1.viewkeys() & d2 获取键的 intersection,即出现在 d1 和 d2 中的键。

    b = {k: d1[k] for k in sym_diff.viewkeys() & d1} 创建一个包含 d1 中出现在 sym_diff 集中的键的字典。

    b.update({k: d2[k] for k in sym_diff.viewkeys() & d2}) 更新 b 添加来自 d2 的键/值对,使用出现在 sym_diff 中的键,因此您最终得到一个字典 b,其中包含来自 sym_diff 集合的所有键及其值.

    【讨论】:

    • 感谢它的工作,但对于 dict_interdiff({1: 2}, {2: 1}) 它返回了Traceback (most recent call last): File "submission.py", line 5, in dict_interdiff a = {k:f(d1[k],d2[k]) for k in sym_diff} File "submission.py", line 5, in <dictcomp> a = {k:f(d1[k],d2[k]) for k in sym_diff} KeyError: 1
    • @jamessmith,是的,请参阅编辑
    • 抱歉耽误了您的时间,但您能解释一下您的代码在做什么吗(我是新手,阅读代码很慢)
    • @Padraic Cunningham 非常感谢你(这就是我喜欢这个社区的原因,它一直帮助到最后),像你这样伟大的人做到了。再次感谢
    • @Padraic Cunningham 这个问题没有什么不清楚的地方,你解释得很好。谢谢
    【解决方案3】:

    根据差异,看起来很简单。

    def dict_interdiff(d1, d2, f):
      sameKeys = set(d1.keys()) & set(d2.keys())  # Keys in both dicts
      same     = dict([(k, f(d1[k],d2[k])) for k in sameKeys])  # f applied
      diffKeys = set(d1.keys())^set(d2.keys())   # Keys in single dict
      diffs    = dict([(k,d1.get(k, d2.get(k))) for k in diffKeys])  # values
      return (same,diffs,)
    

    我想我应该分享一下它提供了预期结果的确认信息!

    >>> dict_interdiff(d1, d2, f)
    ({1: 70, 2: 70, 3: 90}, {4: 70, 5: 80, 6: 90})
    

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2017-11-13
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多