自定义排序键引发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
相关产品推荐
相关产品推荐

