合并2个词典的最pythonic方法是什么,但是将值设为平均值?

时间:2011-07-13 10:11:50

标签: python dictionary

d1 = { 'apples': 2, 'oranges':5 }
d2 = { 'apples': 1, 'bananas': 3 }


result_dict = { 'apples': 1.5, 'oranges': 5, 'bananas': 3 }

最好的方法是什么?

6 个答案:

答案 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