如何为词典实现元素明细max
,min
,avg
,+
等操作?
举个例子:
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
等应该同样实施吗?
(tutorial和library reference没有明显的答案)
答案 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}