使用Python排序而不使用lambda表达式

7 投票
4 回答
5364 浏览
提问于 2025-04-16 02:18

我经常在Python中使用lambda表达式进行排序,虽然这样做没问题,但我觉得可读性不太好,希望能有更好的方法。这里是我常见的一个例子。

我有一个数字列表,比如说 x = [12, 101, 4, 56, ...]

还有一个单独的索引列表: y = range(len(x))

我想根据 x 中的值来排序 y,我通常是这样做的:

y.sort(key=lambda a: x[a])

有没有什么好的方法可以不使用lambda来实现这个呢?

4 个回答

5

我不太确定这是不是你想要的另一种方法,但你可以用一个 def 来定义关键函数:

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

我个人觉得这样比用 lambda 更糟,因为它把排序的标准放到了执行排序的代码之外,而且还多了一个 sort_key 函数,这样会让你的命名空间变得复杂。

7

虽然不是很优雅,但可以这样做:

[a for (v, a) in sorted((x[a], a) for a in y)]

顺便说一下,你可以在不创建单独的索引列表的情况下做到这一点:

[i for (v, i) in sorted((v, i) for (i, v) in enumerate(x))]
12

你可以使用列表 x 的 __getitem__ 方法。这个方法的效果和你用的 lambda 函数是一样的,而且速度会快很多,因为它是用 C 语言实现的,而不是用 Python 实现的。

>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]

撰写回答