如果我有一个如此定义的列表:
myresults = [
[1,"A",2],
[2,"Z",1],
[3,"J",0]
]
我需要对列表进行排序。我知道我可以使用sorted()
函数和一个关键函数lambda=x:x[i]
,其中i
是在列表中排序的位置。所以这应该有效:
print sorted(myresults, key=lambda x:x[1])
并返回在子列表中第2列上排序的列表。
您如何调整快速排序算法来处理多维列表?
答案 0 :(得分:3)
快速而肮脏的解决方案。 如果你的快速排序看起来像这样:
def qsort(lst):
if len(lst) == 0:
return []
else:
pivot = lst[0]
lesser = qsort([x for x in lst[1:] if x < pivot])
greater = qsort([x for x in lst[1:] if x >= pivot])
return lesser + [pivot] + greater
您可以使用索引变量按所需维度进行排序:
def qsort_index(lst, index):
if len(lst) == 0:
return []
else:
pivot = lst[0]
lesser = qsort_index([x for x in lst[1:] if x[index] < pivot[index]], index)
greater = qsort_index([x for x in lst[1:] if x[index] >= pivot[index]], index)
return lesser + [pivot] + greater
>>> qsort_index(myresults, 0)
[[1, 'A', 2], [2, 'Z', 1], [3, 'J', 0]]
>>> qsort_index(myresults, 1)
[[1, 'A', 2], [3, 'J', 0], [2, 'Z', 1]]
>>> qsort_index(myresults, 2)
[[3, 'J', 0], [2, 'Z', 1], [1, 'A', 2]]
这种实现远非最佳,但我认为你有了这个想法。
答案 1 :(得分:2)
您可以使用Python的operator模块。
import operator
sorted(myresults, key=operator.itemgetter(0))
[[1, 'A', 2], [2, 'Z', 1], [3, 'J', 0]]
sorted(myresults, key=operator.itemgetter(1))
[[1, 'A', 2], [3, 'J', 0], [2, 'Z', 1]]
答案 2 :(得分:1)
你可以用这种方式实现:
import operator
list.sort(key=operator.itemgetter(*args))
这也可以。
import operator
sorted(list, key=operator.itemgetter(1))