求助:Python排序列表字典时出现KeyError的原因与解决方法
字典列表排序的KeyError问题分析与解决
你的代码与错误信息
你编写的代码:
if __name__ == '__main__': arr=[] for _ in range(int(input())): name = input() score = float(input()) arr.append({name: score}) print(arr) print(sorted(arr,key=lambda x: x[1]))
运行时触发的错误:
Traceback (most recent call last): File "/tmp/submission/20240211/09/34/hackerrank-1e461b8e0b66f9b6cec57a2d76f20107/code/Solution.py", line 9, in <module> print(sorted(arr,key=lambda x: x[1])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/submission/20240211/09/34/hackerrank-1e461b8e0b66f9b6cec57a2d76f20107/code/Solution.py", line 9, in <lambda> print(sorted(arr,key=lambda x: x[1])) ~^^^ KeyError: 1
错误产生的原因
你创建的arr列表里,每个元素是仅包含单个键值对的字典(比如{"Alice": 85.0})。排序时你用lambda x: x[1],是试图用整数1作为键去获取字典的值,但你的字典键是输入的名字(字符串类型),不存在键1,所以触发了KeyError。
你忽略的字典底层特性
- 字典是键值映射结构,不是序列(比如列表、元组),不能通过位置索引(比如
x[1])访问元素,必须通过对应的键来取值。 - 你当前的每个字典只有一个键值对,这种设计完全浪费了字典的多键存储能力,反而增加了取值的复杂度。
解决方法
有两种简洁的修正思路:
思路1:统一字典的键名
把每个字典改成包含固定键的结构(比如{"name": 姓名, "score": 分数}),这样排序时可以通过固定键获取分数:
if __name__ == '__main__': arr=[] for _ in range(int(input())): name = input() score = float(input()) # 用固定键存储姓名和分数 arr.append({"name": name, "score": score}) print(arr) # 通过固定键"score"指定排序依据 print(sorted(arr, key=lambda x: x["score"]))
思路2:改用元组存储数据
如果不需要字典的键值特性,直接用元组存储姓名和分数更高效,元组支持位置索引访问:
if __name__ == '__main__': arr=[] for _ in range(int(input())): name = input() score = float(input()) # 用元组存储,第一个元素是姓名,第二个是分数 arr.append((name, score)) print(arr) # 通过索引1获取分数作为排序依据 print(sorted(arr, key=lambda x: x[1]))
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

