两个部门的成员操作

时间:2016-06-27 17:56:36

标签: python dictionary max

如何为词典实现元素明细maxminavg+等操作?

举个例子:

def max_dict(d1, d2):
    ''' @return the maximum member value for each key
    >>> a = {3: 4, 4: 7}; b = {3: 5, 4: 6}; max_dict(a, b)
    {3: 5, 4: 7}
    '''
    out = {}
    for (k, v) in d1.iteritems():
        out[k] = max(v, d2[k])
    return out

这是一种明智的方法吗?是否有一些内置功能来简化这个? +avg等应该同样实施吗?

tutoriallibrary reference没有明显的答案)

3 个答案:

答案 0 :(得分:3)

  

这是一种明智的方法吗?

呀。我可能会使用dict理解,但循环工作正常。

  

是否有一些内置函数来简化这个?

没有

  

+avg等应该以类似方式实施吗?

您可以将该函数作为参数应用:

def dict_elementwise(func, d1, d2):
    return {k: func(d1[k], d2[k]) for k in d1}

答案 1 :(得分:2)

像这样:

d1 = {1:2, 3:4}
d2 = {1:-8, 3:10}
print {k:min(v, d2[k]) for k,v in d1.items()}

这使用了Python的dictionary comprehension语法。

如果词典有不同的键:

d3 = {1:-8, 3:10}
print {k:min(v, d3[k]) for k,v in d1.items() if k in d3}

将找到与d1和d3键相交的产品值。

所以,一般来说:

def map_values_for_keys(func, d1, d2):
    """
    Return a dictionary of k:func(d1[k], d2[k]) for each key k
    defined in both dictionaries d1 and d2.        
    """
    return {func(v, d2[k]) for k,v in d1.items() if k in d2}

...虽然,老实说,我实际上不喜欢为这种情况定义一个函数,因为字典理解既易于阅读(通过练习),又对读者来说是明确的。

答案 2 :(得分:1)

这个可以推广到任意数量的dicts,你可以应用于列表的任何函数,以及使用不同键的dicts:

def agg_dicts(func, *args):
    keys = []
    for d in args:
        keys += list(d.keys())
    keys = set(keys)

    out = {}
    for key in keys:
        vals = [d[key] for d in args if key in d.keys()]
        out[key] = func(vals)

    return out

from numpy import mean

a = {'one':1, 'two':4, 'four':2}
b = {'one':2, 'two':2}
c = {'two':4, 'four':2, 'five':5}

dict_min = agg_dicts(min, a, b, c)
dict_max = agg_dicts(max, a, b)
dict_avg = agg_dicts(mean, a, b, c)
dict_sum = agg_dicts(sum, a, b, c)

dict_max
{'four': 2, 'one': 2, 'two': 4}

dict_min
{'five': 5, 'four': 2, 'one': 1, 'two': 2}

dict_max
{'four': 2, 'one': 2, 'two': 4}

dict_avg
{'five': 5.0, 'four': 2.0, 'one': 1.5, 'two': 3.3333333333333335}

dict_sum
{'five': 5, 'four': 4, 'one': 3, 'two': 10}