2012-05-16 70 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