如何正确对字典列表按键或值排序(解决 KeyError: 1 错误)

如何正确对字典列表按键或值排序(解决 KeyError: 1 错误)

本文详解 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] 获取唯一值:

GitHub Copilot

GitHub Copilot

GitHub AI编程工具,实时编程建议

下载

# 安全提取字典中唯一的数值(假设每个字典仅含一个键值对)
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()) 可快速确认字典内容与结构。

掌握字典的键值访问本质,是写出清晰、可靠排序逻辑的关键一步。

https://www.php.cn/faq/2038530.html

发表回复

Your email address will not be published. Required fields are marked *