2016-06-02 14 views
5

sto cercando di convertire il codice che è scritto in Python 2 a Python 3Come convertire l'ordinamento usando cmp da python 2 a python 3?

nums = ["30", "31"] 
num.sort(cmp=lambda x, y: cmp(y + x, x + y)) 

Non sai come farlo in Python 3 dal cmp viene rimosso (credevo)

Il risultato dovrebbe essere ["31", "30"] anziché ["30", "31"]

+0

@Pythonista: non si sta ordinando in ordine inverso. È molto più sottile di quello, e convertire il comparatore in una funzione chiave è in realtà piuttosto complicato. – user2357112

+2

https://docs.python.org/3.5/library/functools.html#functools.cmp_to_key –

+0

Puoi fornire dati di test che non riescono con 'sort (reverse = True)'? –

risposta

9

Questo è uno dei rari casi in cui un comparatore è molto più pulito di una funzione chiave. Avevo in realtà solo reimplementare cmp:

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

e quindi utilizzare functools.cmp_to_key per convertire il comparatore per un Python 3 stile tasto funzione:

nums.sort(key=functools.cmp_to_key(lambda x, y: cmp(y+x, x+y))) 

Per chiunque chiedendo cosa realmente fa questo strano tipo, si trova l'ordine in cui concatenare le stringhe di input per produrre la stringa di output lessicograficamente più grande. Quando tutte le stringhe sono sequenze di cifre, l'output ha il valore numerico più alto possibile.

+0

Oppure 'def cmp (x, y): return (x> y) - (x

Problemi correlati