我经常使用lambda表达式在Python中进行排序,虽然它工作正常,但我觉得它不太可读,并且希望可能有更好的方法。对我来说,这是一个典型的用例。没有lambda表达式的python排序
我有一个数字的列表,例如,x = [12, 101, 4, 56, ...]
我有指标的单独列表:y = range(len(x))
我想基于x
值进行排序y
,而我这样做:
y.sort(key=lambda a: x[a])
有没有好的方法来做到这一点,而不使用lambda?
我经常使用lambda表达式在Python中进行排序,虽然它工作正常,但我觉得它不太可读,并且希望可能有更好的方法。对我来说,这是一个典型的用例。没有lambda表达式的python排序
我有一个数字的列表,例如,x = [12, 101, 4, 56, ...]
我有指标的单独列表:y = range(len(x))
我想基于x
值进行排序y
,而我这样做:
y.sort(key=lambda a: x[a])
有没有好的方法来做到这一点,而不使用lambda?
您可以使用列表x的__getitem__
方法。这种行为与您的Lambda和因为它是作为一个C函数,而不是一个Python函数实现会快很多:
>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]
谢谢,我认为这是最可读的解决方案。 – 2010-08-04 18:16:35
胜之不武,但:
[a for (v, a) in sorted((x[a], a) for a in y)]
顺便说一句,你可以做到这一点,而无需创建索引的单独列表:
我不知道这是否是一种另类的你的意思,但你可以定义一个def
关键功能:
def sort_key(value):
return x[value]
y.sort(key = sort_key)
就个人而言,我觉得牛逼他比lambda
更糟,因为它将排序标准从执行排序的代码行中移开,并且不必要地将sort_key
函数添加到您的名称空间中。
我想,如果我想创造另一个函数,我可以做到这样的事情(未测试):
def sortUsingList(indices, values):
return indices[:].sort(key=lambda a: values[a])
虽然我觉得我更喜欢使用拉姆达代替,以避免产生额外的功能。
你正在使用lambda反对它的请求(虽然我会自己使用它)。 – 2010-08-04 20:26:37
任何特别的原因,为什么原始值的排序列表是不够的? 'x_sorted = sorted(x)' – MattH 2010-08-04 16:12:34
OP需要按排序顺序的元素的索引,而不是元素本身。 – PaulMcG 2010-08-04 16:23:55
“lambda”是一个长而丑陋的关键字,这真是一种遗憾。这几乎是做到这一点的方法。 – PaulMcG 2010-08-04 16:25:19