为何list.sort()失效但sorted()在该列表排序场景下正常工作?
为什么
list.sort()报错而sorted()能正常工作? 这个问题的核心其实是list.sort()和sorted()的本质区别——一个是原地修改原列表,一个是基于原列表生成新列表,再加上你的key函数依赖原列表的状态,才导致了这个报错。
具体原因分析
1. 使用list2.sort()时的报错逻辑
list.sort()是原地排序方法,排序过程中会直接修改调用它的列表(也就是你的list2)。你的key函数lambda x: list1[list2.index(x)]需要每次在list2中查找元素x的索引,但排序时list2的元素一直在被重新排列:
- 排序算法的中间步骤可能会临时移动或调整元素位置,导致当lambda尝试查找某个元素(比如
'four')时,该元素此时并不在当前的list2状态中; - 直接调用
list2.index(x)自然会找不到目标元素,抛出ValueError: 'four' is not in list。
2. 使用sorted()时的正常逻辑
sorted()是生成新列表的排序函数,它不会修改原list2,而是先复制一份原列表的元素来进行排序操作。此时你的key函数里的list2始终指向最初未被修改的原始列表:
- 不管排序进行到哪一步,
list2.index(x)都是在原始列表中查找元素的索引,总能精准找到对应的位置; - 因此可以正确获取
list1里的对应数值作为排序key,最终得到你预期的结果。
更优的写法建议
你的原始写法还有个隐藏的效率问题:list.index()是O(n)时间复杂度的操作,当列表元素较多时,排序效率会很低。更稳妥高效的方式是先建立元素到对应数值的映射字典,再用字典查找来做key:
list1 = [4,6,2,3,1,5] list2 = ['four','six','two','three','one','five'] # 创建元素与对应数值的映射字典 num_mapping = dict(zip(list2, list1)) # 利用字典的O(1)查找效率进行排序 list2.sort(key=lambda x: num_mapping[x]) print(list2) # 输出: ['one', 'two', 'three', 'four', 'five', 'six']
内容的提问来源于stack exchange,提问作者Saurav Yadav
相关产品推荐
相关产品推荐

