2012-05-16 124 views
0

列表如果我定义为这样一个列表清单:快速排序包含使用python

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

是不是_that_“多维”? –

+1

这与快速排序有什么关系? – Daenyth

+1

哪种快速排序算法?你自己? – NPE

回答

1

你可以用这种方式实现:

import operator 
list.sort(key=operator.itemgetter(*args)) 

,这将工作太..

import operator 
sorted(list, key=operator.itemgetter(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]] 
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]] 

这个实现是远远最佳,但我觉得你有这个想法。

+0

谢谢,这太好了。 –

+0

这不起作用。我认为在较小的声明中有一个错误。 –

+0

@ josh1234:fixed)) – cval