d1 = { 'apples': 2, 'oranges':5 }
d2 = { 'apples': 1, 'bananas': 3 }
result_dict = { 'apples': 1.5, 'oranges': 5, 'bananas': 3 }
最好的方法是什么?
答案 0 :(得分:7)
这是一种方式:
result = dict(d2)
for k in d1:
if k in result:
result[k] = (result[k] + d1[k]) / 2.0
else:
result[k] = d1[k]
答案 1 :(得分:6)
这适用于任意数量的词典:
dicts = ({"a": 5},{"b": 2, "a": 10}, {"a": 15, "b": 4})
keys = set()
averaged = {}
for d in dicts:
keys.update(d.keys())
for key in keys:
values = [d[key] for d in dicts if key in d]
averaged[key] = float(sum(values)) / len(values)
print averaged
# {'a': 10.0, 'b': 3.0}
更新:@mhyfritz展示了如何将3行减少为1的方法!
dicts = ({"a": 5},{"b": 2, "a": 10}, {"a": 15, "b": 4})
averaged = {}
keys = set().union(*dicts)
for key in keys:
values = [d[key] for d in dicts if key in d]
averaged[key] = float(sum(values)) / len(values)
print averaged
答案 2 :(得分:3)
你的问题是最'Pythonic'的方式。
我认为对于像这样的问题,Pythonic方式非常明确。有很多方法可以解决这个问题!如果你真的只有2个dicts,那么假设这个的解决方案很棒,因为它们更简单(并且更容易阅读和维护)。但是,拥有通用解决方案通常是一个好主意,因为这意味着您不需要为其他有3个词典的情况复制大量逻辑。
作为附录,phant0m的答案很好,因为它使用了许多Python的功能来使解决方案可读。我们看到列表理解:
[d[key] for d in dicts if key in d]
使用Python非常有用的set
类型:
keys = set()
keys.update(d.keys())
通常,很好地使用Python的类型方法和全局变量:
d.keys()
keys.update( ... )
keys.update
len(values)
思考和实现一个解决这个问题的算法是一回事,但是利用语言的力量使它变得优雅和可读是大多数人认为'Pythonic'的原因。
(我会使用phant0m的解决方案)
答案 3 :(得分:2)
另一种方式:
result = dict(d1)
for (k,v) in d2.items():
result[k] = (result.get(k,v) + v) / 2.0
答案 4 :(得分:0)
在这种情况下,计数器和一些生成器很有用
一般案例:
>>> d1 = { 'apples': 2, 'oranges':5 }
>>> d2 = { 'apples': 1, 'bananas': 3 }
>>> all_d=[d1,d2]
>>> from collections import Counter
>>> counts=Counter(sum((d.keys() for d in all_d),[]))
>>> counts
Counter({'apples': 2, 'oranges': 1, 'bananas': 1})
>>> s=lambda k: sum((d.get(k,0) for d in all_d))
>>> result_set=dict(((k,1.0*s(k)/counts[k]) for k in counts.keys()))
>>> result_set
{'apples': 1.5, 'oranges': 5.0, 'bananas': 3.0}
答案 5 :(得分:0)
d1 = { 'apples': 2, 'oranges':5 }
d2 = { 'apples': 1, 'bananas': 3, 'oranges':0 }
dicts = [d1, d2]
result_dict = {}
for dict in dicts:
for key, value in dict.iteritems():
if key in result_dict:
result_dict[key].append(value)
else:
result_dict[key] = [value]
for key, values in result_dict.iteritems():
result_dict[key] = float(sum(result_dict[key])) / len(result_dict[key])
print result_dict