字典元素的总和

2024-04-29 00:52:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本关于姓名和年龄的词典。有些名字是相同的。我想把相同名字的年龄加起来。你知道吗

我的假数据是这样的:

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

示例中有两个ann。所以我想把这两个人的年龄加起来。 目前我有一本字典:

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

我认为像这样把数据放到字典里不是最好的解决办法。还有什么好的解决方案可以存储数据并将其处理到输出中?你知道吗


Tags: 数据示例字典解决方案名字dict词典姓名
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);然后每次迭代都将数字加到该值上。你知道吗

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

因为dict不能包含重复的键,所以可以从元组列表开始。你知道吗

from collections import defaultdict
combined = defaultdict(int)

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

然后使用defaultdict构建dict。诀窍是defaultdict(int)创建一个dict,其条目默认为0,这样就不必处理不存在的键。你知道吗

你的假数据不可能是那样的。在一个字典中不可能有两个具有相同键的条目,也许您的意思是使用不同的数据结构?(不是字典)。但如果你的数据是这样的:

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

那么adefaultdict是个好主意:

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}

相关问题 更多 >