使用Python排序而不使用lambda表达式
我经常在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]