理解python

时间:2016-02-16 17:28:41

标签: python python-2.7

我是python的新手并且遇到了这个问题,因为英语不是我的母语所以我对这个问题有点麻烦但写了我的代码,因为我从这个问题中理解我可以告诉我是否正确如果没有请改进我的代码或给你的

假设您有两个词典d1和d2,每个词典都有整数键和整数值。您还将获得一个函数f,它接受两个整数,对它们执行未知操作,并返回一个值。

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

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

差异 :差异字典中的键值对是 (a)每个键值对 在d1中,其键仅出现在d1而不出现在d2或(b)中 d2中的键值对 key仅出现在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已定义且我不知道,因此无法在我的解释器中运行

3 个答案:

答案 0 :(得分:0)

根据差异,似乎非常简单。

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})

答案 1 :(得分:0)

您可以使用dicts上的set操作完成所有操作:

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,即 ab中的键,但不在两者中

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使用sym_diff中显示的键添加d2中的键/值配对,以便最终获得包含b中所有键的词典sym_diff {1}}设置及其值。

答案 2 :(得分:0)

您可以随时在文件中自行定义代码。这是我的简单实现:

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