在Python中对混合列表进行排序

时间:2015-10-12 20:51:14

标签: python python-2.7 sorting lambda

说我有这个列表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上搜索了相关的页面但是找不到一般的方法。

1 个答案:

答案 0 :(得分:3)

我认为这里的第一个问题是你有一个混合列表 - 一般来说,当你不知道你可以对哪个元素进行哪些操作时,遵循代码变得很棘手,因为它们不是#39 ; t都是相同的类型。

没有通用的解决方案(因为没有通用的方式来了解如何比较不同类型的对象),但你绝对可以处理你拥有的情况(如果必须的话)......

import numbers
sorted(l, key=lambda x: (isinstance(x, numbers.Number), x))

应该做的伎俩。基本上,我的键函数返回tuple。由于tuple(以及所有python序列)按字典顺序排序,因此python将首先查看元组的第一个元素 - 在这种情况下,它将是False0) 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]