假设我有这个列表 l = ['the Fountainhead','atlas shrugged', 1, 67, 12, 0]
我想对其进行排序,以便最终结果为 ['阿特拉斯耸耸肩', '源泉', 0, 1, 12, 67]
.这意味着列表中的字符串和整数都应按升序排序。如果我使用 sorted()
数字首先出现:
>>> sorted(l)
[0, 1, 12, 67, 'atlas shrugged', 'the fountainhead']
如果我使用 lambda,它无法对列表进行排序,因为它包含不同类型的不可比较的元素:
>>> sorted(l, key=lambda x:int(x))
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
sorted(l, key=lambda x:int(x))
File "<pyshell#13>", line 1, in <lambda>
sorted(l, key=lambda x:int(x))
ValueError: invalid literal for int() with base 10: 'the fountainhead'
据我所知,在使用 lambda 时无法利用异常处理。这只是一个简单的例子来说明这个问题。我想知道Python中是否有一种通用的灵活方法来对混合列表进行排序。我已经搜索了 SO 的相关页面,但找不到通用的方法。
最佳答案
我认为这里的第一个问题是你有一个混合列表 - 一般来说,当你不知道可以对哪个元素执行什么操作时,遵循代码会变得很棘手,因为它们并不都是相同类型。
没有通用的解决方案(因为没有通用方法来知道如何比较不同类型的对象),但是您绝对可以处理您所遇到的情况(如果必须的话)...
import numbers
sorted(l, key=lambda x: (isinstance(x, numbers.Number), x))
应该可以解决问题。基本上,我的关键函数返回一个元组。由于tuple
(以及所有Python序列)是按字典顺序排序的,Python将首先查看元组的第一个元素——在这种情况下,它将是False
( >0
) 如果该项目不是数字,那么这些元素将首先出现。
演示:
>>> l = [1, 2, 3, 'foo', 'bar', 4, 8, -10, 'baz']
>>> import numbers
>>> sorted(l, key=lambda x: (isinstance(x, numbers.Number), x))
['bar', 'baz', 'foo', -10, 1, 2, 3, 4, 8]
关于python - 在 Python 中对混合列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33089980/