不带lambda表达式的python排序

不带lambda表达式的python排序,python,lambda,sorting,Python,Lambda,Sorting,我经常使用lambda表达式在Python中进行排序,尽管它工作得很好,但我发现它不太可读,并且希望有更好的方法。这是我的一个典型用例 我有一个数字列表,例如,x=[12,101,4,56,…] 我有一个单独的索引列表:y=range(len(x)) 我想根据x中的值对y进行排序,我这样做: y.sort(key=lambda a: x[a]) 有没有一种不用lambda就能做到这一点的好方法?不优雅,但: [a for (v, a) in sorted((x[a], a) for a in

我经常使用lambda表达式在Python中进行排序,尽管它工作得很好,但我发现它不太可读,并且希望有更好的方法。这是我的一个典型用例

我有一个数字列表,例如,
x=[12,101,4,56,…]

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

我想根据
x
中的值对
y
进行排序,我这样做:

y.sort(key=lambda a: x[a])
有没有一种不用lambda就能做到这一点的好方法?

不优雅,但:

[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))]

我不确定这是否是您所指的替代方案,但您可以使用
def
定义键函数:

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

就个人而言,我认为这比
lambda
更糟糕,因为它将排序标准从执行排序的代码行移开,并且不必要地将
sort\u key
函数添加到您的命名空间中。

我想如果我想创建另一个函数,我可以这样做(未经测试):


尽管我认为我更喜欢使用lambda,以避免创建额外的函数。

您可以使用列表x的
\uuuu getitem\uuuu
方法。这与lambda的行为相同,并且速度更快,因为它是作为C函数而不是python函数实现的:

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

为什么原始值的排序列表不能满足要求
x_sorted=sorted(x)
OP希望元素的索引按排序顺序排列,而不是元素本身。遗憾的是,
lambda
是一个如此长且丑陋的关键字。这几乎就是解决问题的方法。看起来与我回答给出的“排名顺序列表”解决方案非常相似,不幸的是,lambda。对我来说,我更喜欢它而不是itemgetter解决方案。您正在使用lambda来应对请求(尽管我自己也会使用它)。
>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]