您可以编写自己的quicksort 函数。您几乎可以切换一些符号来反转输出:
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)/2]
left = [x for x in arr if x > pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x < pivot]
return quicksort(left) + middle + quicksort(right)
下一步是确保您提取了正确的数字,并确保您可以将它们映射回父列表,以便您可以再次将它们放到正确的位置 - Allen's answer 有一个很好的方法:
L = [['James', '1', '2'], ['Alan', '1', '1'], ['Henry', '1', '5']]
keys = [(int(v[-1]),k) for k,v in enumerate(L)] # This line here
该行基本上创建了一个元组列表,用于存储我们想要排序的数字,以及该数字的父列表在总体列表中的索引。所以基本上,对于L,keys = [(2, 0), (1, 1), (5, 2)]。
因此,您需要更改 quicksort 函数来解决所有这些问题,方法是创建一个可以递归使用的子函数:
def quicksort(arr):
# Put the actual sorting function into a subfunction that can be called recursively
def subsort(arr2):
if len(arr2) <= 1:
return arr2
pivot = arr2[len(arr2)/2]
left = [x for x in arr2 if x > pivot]
middle = [x for x in arr2 if x == pivot]
right = [x for x in arr2 if x < pivot]
return subsort(left) + middle + subsort(right)
# Get the value-key pairs and sort them
keys = [(int(v[-1]),k) for k,v in enumerate(L)]
keys = subsort(keys)
# Do the mapping back to the original array fed into the main function
final = []
for i in keys:
final.append(arr[i[1]])
return final
然后:
>>> L = [['James', '1', '2'], ['Alan', '1', '1'], ['Henry', '1', '5']]
>>> quicksort(L)
[['Henry', '1', '5'], ['James', '1', '2'], ['Alan', '1', '1']]
注意:如果最后一个位置有两个具有相同编号的项目,则它们将在原始列表中恢复其原始相对位置(彼此之间)还原 .有关元组比较的更多详细信息,请参阅this answer,并注意我们在此处按 降序 顺序对内容进行排序(否则,它们只会保持彼此之间的原始位置)。所以:
>>> L = [['Simon', '1', '2'], ['Henry', '1', '5'], ['Finn', '1', '2']
>>> quicksort(L)
[['Henry', '1', '5'], ['Finn', '1', '2'], ['Simon', '1', '2']]