使用python Quicksort包含列表的列表

时间:2012-05-16 13:45:18

标签: python sorting multidimensional-array quicksort

如果我有一个如此定义的列表:

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列上排序的列表。

您如何调整快速排序算法来处理多维列表?

3 个答案:

答案 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))