Python:如何按字典键对列表排序?为何触发TypeError?
问题分析与解决
问题背景
现有列表:
L = ['Jack', 'King', '9', 'King', '10']
字典:
D = {0:'Ace', 1:'King', 2:'Queen', 3:'Jack', 4:'10', 5:'9'}
需求是依据字典D的键对列表L排序,期望输出:[ 'King', 'King', 'Jack', '10', '9' ]。
尝试执行以下代码:
sorted(L, key = D.get)
触发错误:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in ----> 3 sorted(L, key = D.get) TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'
错误原因
你说的没错,字典D的键确实都是整数,但问题出在D.get的用法上:
D.get(x)的作用是以x为键去字典D中查找对应的值,而列表L里的元素是D的值(比如'Jack'、'King'这类字符串),并不是D的键(整数0-5)。- 用这些字符串去查D,根本找不到对应的键,所以
D.get会返回None。 - 当
sorted函数尝试用这些None值作为排序依据时,Python无法比较NoneType实例,就会抛出你看到的TypeError。
正确解决方法
要实现需求,需要先反转字典D,把原字典的“值”作为新字典的“键”,原字典的“键”作为新字典的“值”——因为D里的所有值都是唯一的,所以反转不会有冲突:
# 反转字典,生成值到键的映射 rev_D = {v: k for k, v in D.items()} # 用反转后的字典获取排序依据 sorted_L = sorted(L, key=rev_D.get) print(sorted_L) # 输出: ['King', 'King', 'Jack', '10', '9']
关于反转字典映射
如果遇到值不唯一的字典,反转时需要处理冲突(比如把相同值对应的键存为列表),但在这个场景里D的值都是唯一的,用字典推导式就能直接完成反转。
内容的提问来源于stack exchange,提问作者nilsinelabore
相关产品推荐
相关产品推荐

