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

标签 python python-2.7 sorting lambda

假设我有这个列表 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/

相关文章:

macos - Python basemap 导入错误: "requirement already satisfied"

c# - 给定一个字符串数组,对它们进行随机排序的最简单方法是什么?

.net - SortedList 与 SortedDictionary 与 Sort()

python - 使用单个索引项的 numpy 子矩阵 3D

python - python日志记录是否在它自己的线程中运行?

python - 如何拥有多个工具栏

python - 在异常上下文中获取函数的堆栈帧

python - YAML - 替换变量的值?

python - Sympy coeff 与 as_independent 不一致

r - 测试矩阵或数据框的行是否在 R 中排序