没有lambda表达式的python排序

时间:2010-08-04 16:00:44

标签: python lambda sorting

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

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

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

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

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

有没有一种好方法可以不使用lambda来做到这一点?

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:6)

不优雅,但是:

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

答案 2 :(得分:3)

我不确定这是否是您的意思,但您可以使用def来定义关键功能:

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

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

答案 3 :(得分:0)

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

def sortUsingList(indices, values):
    return indices[:].sort(key=lambda a: values[a])

虽然我认为我更喜欢使用lambda来避免创建额外的功能。