dict元素的总和

时间:2013-07-30 22:48:12

标签: python dictionary

我有一本名字和年龄的字典。有些名字是相同的。我想总结相同名称的年龄。

我的假数据如下所示:

pete: 33
ann: 7
ruth: 3
ann: 5
austin: 90

在示例中有两个anns。所以我想总算一下两个年龄段的年龄。 目前我有一本字典:

dict = {'pete':33,'ann':7,'ruth':3,'ann':5,'austin':90}

我的结果应该是这样的

dict = {'pete':33,'ann':12,'ruth':3,'austin':90}

pete: 33
ann: 12
ruth: 3
austin: 90

我认为将数据放在这样的字典中并不是最好的解决方案。存储数据并将其处理到输出中的其他解决方案是什么?

3 个答案:

答案 0 :(得分:4)

您的虚假数据无法看起来像那样。在字典中有两个具有相同键的条目是不可能的,也许你想使用不同的数据结构? (不是字典)。但如果您的数据如下所示:

input = [('pete', 33), ('ann',7), ('ruth',3), ('ann',5), ('austin',90)]

然后 defaultdict会是一个好主意:

from collections import defaultdict
d = defaultdict(int)

for k, v in input:
    d[k] += v

d
=> defaultdict(<type 'int'>, {'pete': 33, 'ann': 12, 'ruth': 3, 'austin': 90})

或使用Counter

from collections import Counter
d = Counter()

for k, v in input:
    d.update({k:v})

d
=> Counter({'austin': 90, 'pete': 33, 'ann': 12, 'ruth': 3})

另一种解决方案,无需导入额外的库:

d = {}
for k, v in input:
    if k in d:
        d[k] += v
    else:
        d[k] = v

d
=> {'pete': 33, 'ann': 12, 'ruth': 3, 'austin': 90}

答案 1 :(得分:3)

data = [('pete', 33), ('ann', 7), ('ruth', 3), ('ann', 5), ('austin', 90)]

由于dicts不能包含重复键,因此您可以从一个元组列表开始。

from collections import defaultdict
combined = defaultdict(int)

for name, age in data:
    combined[name] += age

然后使用dict构建defaultdict。诀窍是defaultdict(int)创建一个dict,其条目默认为0,因此您不必处理不存在的键。

答案 2 :(得分:3)

您需要使用元组列表

,而不是使用字典
pairs = [ ('pete', 33), ('ann', 7), ('ruth', 3), ('ann', 5), ('austin', 90) ]

然后你可以使用defaultdict计算总和:

from collections import defaultdict
answer = defaultdict(int)
for name, number in pairs:
    answer[name] += number

print(answer)

defaultdict通过调用给定函数(int)来为任何不存在的键提供默认值(int()方便地返回0);然后,对于每次迭代,将数字添加到该数字。