我经常使用lambda表达式在Python中进行排序,虽然它工作正常,但我觉得它不太可读,并且希望可能有更好的方法。这是我的一个典型用例。
我有一个数字列表,例如x = [12, 101, 4, 56, ...]
我有一个单独的索引列表:y = range(len(x))
我想根据y
中的值对x
进行排序,我这样做:
y.sort(key=lambda a: x[a])
有没有一种好方法可以不使用lambda来做到这一点?
答案 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来避免创建额外的功能。