我有一本名字和年龄的字典。有些名字是相同的。我想总结相同名称的年龄。
我的假数据如下所示:
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
我认为将数据放在这样的字典中并不是最好的解决方案。存储数据并将其处理到输出中的其他解决方案是什么?
答案 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);然后,对于每次迭代,将数字添加到该数字。