2012-03-26 43 views
2

我想寫一個合併排序函數,它接受一個列表和比較功能,在Python:比較兩個元組的第二個元素與「<」未能在Python

def sort(unsorted, comp_func=lambda x, y: x < y): 

    length = len(unsorted) 
    if length <= 1: return unsorted 

    halflen = length/2 
    lsorted= sort(unsorted[:halflen]) 
    rsorted = sort(unsorted[halflen:]) 
    combined = [] 

    while True: 
     if len(lsorted) > 0: 
      if len(rsorted) > 0 and comp_func(rsorted[0], lsorted[0]): 
       combined.append(rsorted[0]) 
       rsorted = rsorted[1:] 
      else: 
       combined.append(lsorted[0]) 
       lsorted = lsorted[1:] 
     elif len(rsorted) > 0: 
      combined.append(rsorted[0]) 
      rsorted = rsorted[1:] 
     else: 
      break 

    return combined 

它工作正常列表爲int(使用默認的comp_func),以及當比較函數比較這樣一個元組的第一個元素時具有2個元組的列表int

comp_func = lambda x, y: x[0] < y[0] 

但是,當我編寫比較函數以通過元組的第二個元素進行比較時,返回的列表仍然是未排序的版本。

comp_func = lambda x, y: x[1] < y[1] 

但是,如果我改變「<」操作員「>」,這樣的列表將被遞減排序,它的工作原理:

comp_func = lambda x, y: x[1] > y[1] 

不知道爲什麼「<」失敗在元組的第二個元素上...

已經搜索了可能的解釋,我發現這個:Does python think 10 is less than 9。但是,情況並非如此;正在排序的列表包含元組int,而不是字符串

+0

你忘了測試向量(S)。 – 2012-03-26 03:23:53

回答

1

你實際上並不表明你是如何改變運營成績單,所以這只是一個猜測,但是請注意,這兩條線

lsorted= sort(unsorted[:halflen]) 
rsorted = sort(unsorted[halflen:]) 

不及格comp_func。所以,如果你做了這樣的事情:

>>> sort([(3,4),(1,2), (2,3)]) 
[(1, 2), (2, 3), (3, 4)] 
>>> sort([(3,4),(1,2), (2,3)],lambda x,y: x[1] > y[1]) 
[(3, 4), (1, 2), (2, 3)] 

,你會得到不一致的結果,因爲一半的時間它的排序與不同comp_func。在lsorted=rsorted=線穿境而comp_func修復此:

>>> sort([(3,4),(1,2), (2,3)],lambda x,y: x[1] > y[1]) 
[(3, 4), (2, 3), (1, 2)] 
+0

我明白了。只需將'comp_func'傳遞給這兩個遞歸調用,就可以得到預期的結果。非常感謝!!! – rokux 2012-03-26 04:48:38