2017-03-16 36 views
1

當我嘗試將它移植它的錯誤了,要求爲key2如何轉換這個列表排序功能在Python 2到Python 3

的Python 2:

def SortItems(self,sorter=cmp): 
    items = list(self.itemDataMap.keys()) 
    items.sort(sorter) 
    self.itemIndexMap = items 
    self.Refresh() 

的Python 3:

try: 
    cmp 
except NameError: 
    def cmp(x, y): 
     if x < y: 
      return -1 
     elif x > y: 
      return 1 
     else: 
      return 0 

def SortItems(self,sorter=cmp): 
    items = list(self.itemDataMap.keys()) 
    items.sort(key=sorter) 
    self.itemIndexMap = items 
    self.Refresh() 

得到的錯誤:

items.sort(key=sorter) 
TypeError: __ColumnSorter() missing 1 required positional argument: 'key2' 

它看起來像lambda函數需要第二個參數 任何想法如何使其工作?

也試過functools.cmp_to_key:

def SortItems(self): 
    import locale 
    items = list(self.itemDataMap.keys()) 
    items= sorted(items, key=cmp_to_key(locale.strcoll)) 
    self.itemIndexMap = items 
    self.Refresh() 

四處錯誤:

items= sorted(items, key=cmp_to_key(locale.strcoll)) 
TypeError: strcoll() argument 1 must be str, not int 

可能是因爲我整理整數不是字符串

如何使其成爲INT工作?

回答

1

cmpkey是根本不同的。不過,您可以使用一個轉換功能:functools.cmp_to_key()

+0

試了一下,給出了不同的錯誤。 TypeError:strcoll()參數1必須是str,而不是int。我正在整理整數。任何想法如何使用它的整數? – olekb

+0

什麼?你爲什麼使用'strcoll'函數來比較整數?我不明白你在做什麼。 –

0

從文檔Python3 list.sort():

sort() accepts two arguments that can only be passed by keyword (keyword-only arguments)

key specifies a function of one argument that is used to extract a comparison key from each list element (for example, key=str.lower).

即,鍵可調用只需要在PY3一個參數。因此,在這種情況下做

items.sort(int),或等價items.sort(lambda x: x)

將整理INT升序排列的列表。

一般而言cmp應返回list的每個元素 的比較特性。

def cmp(x): 
    # code to compute comparison property or value of x 
    # eg. return x % 5 

此外,您可以轉換的python2 CMP功能:

The functools.cmp_to_key() utility is available to convert a 2.x style cmp function to a key function.

https://docs.python.org/3/library/stdtypes.html#list.sort