
python中无法直接用索引(如x[1])访问字典元素,因为字典是无序键值对集合,必须通过键名或显式提取键/值来排序;正确做法是使用`x["key"]`、`list(x.keys())[0]`或`list(x.values())[0]`等方式获取目标字段。
你遇到的 KeyError: 1 错误,根源在于对字典数据结构的误解:字典不是列表,不支持整数索引访问(如 x[1])。你的代码中 arr 是一个由单键字典组成的列表(例如 [{"Tom": 4.5}, {"Jerry": 5.6}]),每个字典仅含一个键值对,但键名是动态输入的姓名(如 "Tom"),而非固定字符串 "name" 或数字索引。
❌ 错误原因分析
print(sorted(arr, key=lambda x: x[1])) # 报错!x 是字典,x[1] 尝试按整数键查找,但字典中没有键为 1 的项
x[1] 会触发字典的 __getitem__ 方法,查找键为 1 的值——而你的字典键是字符串(如 "Tom"),自然抛出 KeyError。
✅ 正确解决方案
方案一:统一字典结构(推荐 ✅)
将输入数据组织为结构一致的字典(含固定键 "name" 和 "score"),便于可读性与后续扩展:
if __name__ == '__main__':
arr = []
n = int(input())
for _ in range(n):
name = input().strip()
score = float(input())
arr.append({"name": name, "score": score}) # 统一键名
# 按 score 升序排序
sorted_by_score = sorted(arr, key=lambda x: x["score"])
print(sorted_by_score)
# 按 name 字典序排序
sorted_by_name = sorted(arr, key=lambda x: x["name"])
print(sorted_by_name)方案二:处理单键字典(兼容原始逻辑)
若必须保留 {"Tom": 4.5} 这种格式,则需动态提取键或值:
# 按姓名(字典的唯一键)排序
sorted_by_name = sorted(arr, key=lambda x: list(x.keys())[0])
# 按分数(字典的唯一值)排序
sorted_by_score = sorted(arr, key=lambda x: list(x.values())[0])
print("By name:", sorted_by_name)
print("By score:", sorted_by_score)⚠️ 注意:list(x.keys())[0] 假设每个字典恰好有一个键。若存在空字典或多个键,会引发 IndexError 或逻辑错误。
方案三:使用 next() 更高效地提取单个键/值(进阶)
避免创建完整列表,提升性能(尤其大数据量时):
# 安全提取第一个键(推荐用于单键字典) sorted_by_name = sorted(arr, key=lambda x: next(iter(x.keys()))) # 安全提取第一个值 sorted_by_score = sorted(arr, key=lambda x: next(iter(x.values())))
? 总结与最佳实践
- 永远不要对字典使用整数索引(x[0], x[1])——这是列表/元组的操作;
- 优先设计结构化字典(如 {"name": "...", "score": ...}),而非动态键名,增强代码健壮性与可维护性;
- 若必须用单键字典,请用 list(x.keys())[0] 或 next(iter(x.keys())) 显式提取;
- 排序稳定性:sorted() 返回新列表,原列表不变;如需原地排序,用 arr.sort(key=...);
- 类型安全:输入 score 时建议用 float(input()) 而非 int(),避免浮点分数组丢失精度。
掌握字典的键值访问本质,是写出清晰、可靠 Python 代码的关键一步。










