说我有这个列表l = ['the fountainhead','atlas shrugged', 1, 67, 12, 0]
我要排序,以便最终结果为['atlas shrugged', 'the fountainhead', 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'
据我所知,使用lambdas时无法使用异常处理。这只是一个简单的例子来说明这个问题。我想知道是否有一种通用的灵活方法来在Python中对混合列表进行排序。我在SO上搜索了相关的页面但是找不到一般的方法。
答案 0 :(得分:3)
我认为这里的第一个问题是你有一个混合列表 - 一般来说,当你不知道你可以对哪个元素进行哪些操作时,遵循代码变得很棘手,因为它们不是#39 ; t都是相同的类型。
没有通用的解决方案(因为没有通用的方式来了解如何比较不同类型的对象),但你绝对可以处理你拥有的情况(如果必须的话)......
import numbers
sorted(l, key=lambda x: (isinstance(x, numbers.Number), x))
应该做的伎俩。基本上,我的键函数返回tuple
。由于tuple
(以及所有python序列)按字典顺序排序,因此python将首先查看元组的第一个元素 - 在这种情况下,它将是False
(0
) item isn&#39; ta,因此这些元素将首先出现。
演示:
>>> 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]