2016-12-25 54 views
1

我試圖實現用戶定義的排序函數,類似於蟒列表排序list.sort(CMP =無,鍵=無,反向=假)例如。Python的用戶定義的排序

這裏是我到目前爲止的代碼

from operator import itemgetter 

class Sort: 
    def __init__(self, sList, key = itemgetter(0), reverse = False): 

     self._sList = sList 
     self._key = key 
     self._reverse = reverse 
     self.sort() 

    def sort(self): 

     for index1 in range(len(self._sList) - 1): 
      for index2 in range(index1, len(self._sList)): 

       if self._reverse == True: 

        if self._sList[index1] < self._sList[index2]: 
         self._sList[index1], self._sList[index2] = self._sList[index2], self._sList[index1] 

       else: 

        if self._sList[index1] > self._sList[index2]: 
         self._sList[index1], self._sList[index2] = self._sList[index2], self._sList[index1] 


List = [[1 ,2],[3, 5],[5, 1]] 
Sort(List, reverse = True) 
print List 

我有一個非常糟糕的時候,它涉及到關鍵參數。

更具體地說,我想知道是否有一種方法來編碼帶有可選索引的列表(類似於foo(*參數))。

我真的希望你能理解我的問題。

回答

3

key是將項目轉換爲用於比較的標準的功能。

以項目作爲唯一參數調用時,它會返回您選擇的可比較值。存儲爲字符串整數

一個經典的重要例子是:

lambda x : int(x) 

所以串數字順序排序。

在你的算法,你必須通過

self._key(self._sList[index1]) < self._key(self._sList[index2]) 

所以從項目計算出的值進行比較,以取代

self._sList[index1] < self._sList[index2] 

,而不是項目本身。

請注意,Python 3刪除了cmp方法,並且只保留了key方法。

也注意到,在你的情況下,使用itemgetter(0)的關鍵功能適用於標化物品,如liststr(僅第一項排序)(由第一個字符只排序)。

+0

好的,非常感謝,你真的幫了我 –

+0

不客氣。如果您喜歡,請接受答案:http://stackoverflow.com/help/someone-answers –