You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:13:37