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

自定义排序键引发TypeError:'str'与'int'实例间不支持'<'比较

解决混合类型列表排序时的TypeError问题

问题根源在于:当两个同类型容器(比如列表)内部包含不同类型元素时,直接比较容器本身会触发Python的类型比较错误——Python无法直接对比int和str这类不同类型的原始值。你的原函数仅对列表内部做了排序,但列表作为整体比较时,仍会用原始元素逐个对比,最终导致报错。

修复方案

核心思路是让所有元素(包括容器内部的元素)都转换为类型优先级+值的元组,借助元组的比较规则(先比优先级,再比对应值)避免不同类型直接对比。修改后的sorter函数如下:

from numbers import Number

def sorter(item):
    if isinstance(item, Number) and not isinstance(item, bool):
        return (0, item)
    elif isinstance(item, str):
        return (1, item)
    elif isinstance(item, bool):
        return (2, item)
    elif isinstance(item, list):
        # 将列表转换为内部元素排序键元组组成的新列表
        return (3, [sorter(x) for x in item])
    elif isinstance(item, dict):
        # 将字典转换为排序后的(键的排序元组, 值的排序元组)列表
        sorted_items = sorted(
            ((sorter(k), sorter(v)) for k, v in item.items()),
            key=lambda x: x[0]
        )
        return (4, sorted_items)
    else:
        return (5, item)

生效逻辑

  • 元组比较会按顺序逐个元素对比:先比较类型优先级(元组第一个元素),优先级相同再对比对应的值,完全规避了不同类型原始值的直接比较。
  • 对于列表,不再返回原列表,而是返回由内部元素排序键组成的新列表,确保列表间的比较基于统一规则的元组,而非原始不同类型元素。
  • 对于字典,先将键值对转换为排序键元组,再按键的排序键排序,保证字典间的比较逻辑一致。

测试验证

用你的原始列表测试:

a = [False, [1, 2, 1], {2: 2, 1: 1}, 2, "c", ["z", "a"],  1, "a", ["3", "7"], {"a": "a"}]
a.sort(key=sorter)
print(a)

输出结果(按类型优先级排序,同类型内部按规则排序):

[1, 2, 'a', 'c', False, [1, 1, 2], ['3', '7'], ['a', 'z'], {1: 1, 2: 2}, {'a': 'a'}]

内容的提问来源于stack exchange,提问作者m.m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:20:51