计算各玩家总分时触发TypeError错误,求问题分析与解决
错误原因分析
- 遍历方式错误:原代码中
for key,value in a:的写法完全错误。a是由字典组成的列表,直接迭代列表元素时,默认会迭代字典的键,导致key依次取到'name'和'score',value则是对应的字符串(如'Mike')或数字,后续累加时就会出现整数和字符串相加的矛盾,触发TypeError。 - 逻辑判断冗余且错误:原代码用
elif key in s处理累加,这会导致只有当键已存在时才执行累加,但实际上不管键是否存在,都应该执行累加操作,初始化只是为了避免键不存在的报错。
解决方法
方法一:修正遍历与判断逻辑
a=[ {'name': 'Mike', 'score': 10}, {'name': 'Mike', 'score': 8}, {'name': 'Mike', 'score': 6}, {'name': 'John', 'score': 7}, {'name': 'John', 'score': 8}, {'name': 'John', 'score': 5}, {'name': 'John', 'score': 8}, {'name': 'Tom', 'score': 8}, {'name': 'Tom', 'score': 9} ] s = {} for player in a: name = player['name'] score = player['score'] if name not in s: s[name] = 0 s[name] += score # 无需elif,直接累加 print(s)
方法二:使用字典get()方法简化代码
dict.get(key, default)可直接获取键对应的值,不存在则返回默认值,省去判断逻辑:
a=[ {'name': 'Mike', 'score': 10}, {'name': 'Mike', 'score': 8}, {'name': 'Mike', 'score': 6}, {'name': 'John', 'score': 7}, {'name': 'John', 'score': 8}, {'name': 'John', 'score': 5}, {'name': 'John', 'score': 8}, {'name': 'Tom', 'score': 8}, {'name': 'Tom', 'score': 9} ] s = {} for player in a: name = player['name'] s[name] = s.get(name, 0) + player['score'] print(s)
方法三:用collections.defaultdict更简洁
借助collections模块的defaultdict指定默认值类型,无需手动初始化:
from collections import defaultdict a=[ {'name': 'Mike', 'score': 10}, {'name': 'Mike', 'score': 8}, {'name': 'Mike', 'score': 6}, {'name': 'John', 'score': 7}, {'name': 'John', 'score': 8}, {'name': 'John', 'score': 5}, {'name': 'John', 'score': 8}, {'name': 'Tom', 'score': 8}, {'name': 'Tom', 'score': 9} ] s = defaultdict(int) for player in a: s[player['name']] += player['score'] # 需要普通字典的话用dict(s)转换 print(dict(s))
以上三种方法运行后都会得到预期结果:{'Mike': 24, 'John': 28, 'Tom': 17}
内容的提问来源于stack exchange,提问作者Ashkaran
相关产品推荐
相关产品推荐

