
本文详解 python 中对字典列表排序时出现 `keyerror: 1` 的根本原因——误将字典当作列表索引访问,并提供基于键名、键值及动态提取的三种稳健排序方案。
在你的代码中,arr 是一个由单键字典组成的列表,例如 [{"Tom": 4.5}, {"Jerry": 5.6}]。问题出在这一行:
print(sorted(arr, key=lambda x: x[1]))
你试图用整数索引 x[1] 访问字典 x,但字典不是序列,不支持通过数字下标访问(如 x[0] 或 x[1]),它只支持通过键名(如 x["name"])查找值。因此 x[1] 触发 KeyError: 1 —— 字典里根本没有键为 1 的项。
更关键的是,你当前的数据结构设计本身不利于排序:每个字典仅含一个键值对,且键是姓名、值是分数,但键名不统一(如 "Tom"、"Jerry"),无法直接用固定键名(如 "score")作为排序依据。因此需根据实际需求选择合适策略:
✅ 方案一:重构数据结构(推荐)
使用统一字段名的字典,便于可读性和后续操作:
if __name__ == '__main__':
arr = []
n = int(input())
for _ in range(n):
name = input().strip()
score = float(input())
arr.append({"name": name, "score": score}) # 统一键名
# 按分数升序排序
sorted_by_score = sorted(arr, key=lambda x: x["score"])
print(sorted_by_score)
# 按姓名字母序排序
sorted_by_name = sorted(arr, key=lambda x: x["name"])
print(sorted_by_name)✅ 方案二:保留原结构,动态提取值(适用于单键字典)
若必须维持 {"name": score} 形式,可利用 list(x.values())[0] 获取唯一值:
# 安全提取字典中唯一的数值(假设每个字典仅含一个键值对) sorted_by_score = sorted(arr, key=lambda x: list(x.values())[0]) print(sorted_by_score)
⚠️ 注意:list(x.values()) 返回值列表,[0] 取第一个值;此法依赖“每字典仅一个键值对”的前提,否则逻辑失效。
✅ 方案三:按键名(即人名)排序
同样需动态提取键:
sorted_by_name = sorted(arr, key=lambda x: list(x.keys())[0]) print(sorted_by_name)
? 总结与最佳实践
- ❌ 避免 x[0]/x[1] 访问字典——这是列表/元组的操作,字典用 x["key"];
- ✅ 排序前明确目标:按哪个字段排序?该字段是否在所有字典中以相同键名存在?
- ✅ 优先采用结构化字典(如 {"name": ..., "score": ...}),提升代码健壮性与可维护性;
- ? 调试技巧:打印 type(x) 和 list(x.items()) 可快速确认字典内容与结构。
掌握字典的键值访问本质,是写出清晰、可靠排序逻辑的关键一步。










