2010-08-04 38 views
5

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

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

我有指标的单独列表:y = range(len(x))

我想基于x值进行排序y,而我这样做:

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

有没有好的方法来做到这一点,而不使用lambda?

+0

任何特别的原因,为什么原始值的排序列表是不够的? 'x_sorted = sorted(x)' – MattH 2010-08-04 16:12:34

+1

OP需要按排序顺序的元素的索引,而不是元素本身。 – PaulMcG 2010-08-04 16:23:55

+1

“lambda”是一个长而丑陋的关键字,这真是一种遗憾。这几乎是做到这一点的方法。 – PaulMcG 2010-08-04 16:25:19

回答

11

您可以使用列表x的__getitem__方法。这种行为与您的Lambda和因为它是作为一个C函数,而不是一个Python函数实现会快很多:

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

谢谢,我认为这是最可读的解决方案。 – 2010-08-04 18:16:35

5

胜之不武,但:

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

顺便说一句,你可以做到这一点,而无需创建索引的单独列表:

2

我不知道这是否是一种另类的你的意思,但你可以定义一个def关键功能:

def sort_key(value): 
    return x[value] 

y.sort(key = sort_key) 

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

0

我想,如果我想创造另一个函数,我可以做到这样的事情(未测试):

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

虽然我觉得我更喜欢使用拉姆达代替,以避免产生额外的功能。

+0

你正在使用lambda反对它的请求(虽然我会自己使用它)。 – 2010-08-04 20:26:37