2012-07-03 19 views
6

w nowszych Pythona, jestem w stanie korzystać z funkcji sortowania i łatwo układa się listę ciąg zgodnie z ich ostatnich kilku znaków jako takich:Pythona sortowania Ostatnia Postacie

lots_list=['anything'] 

print sorted(lots_list, key=returnlastchar) 

def returnlastchar(s):  
    return s[10:] 

Jak mogę wdrożyć wyżej lots_list.sort(), który jest używany w starszych Python (2.3)?

"Błąd: Kiedy próbowałem za pomocą sorted(), the global name sorted is not defined."

Dzięki!

+4

jak stary jest Twój starszy python? – lucemia

+0

2.3 Myślę. Nie mogę użyć sorted(). Tylko .sort() –

Odpowiedz

8

Schwartzian transform jest zwykle bardziej wydajne niż przy użyciu cmp argumentu (to co nowsze wersje Pythona zrobić podczas używania key argumentu)

lots_list=['anything'] 

def returnlastchar(s):  
    return s[10:] 

decorated = [(returnlastchar(s), s) for s in lots_list] 
decorated.sort() 
lots_list = [x[1] for x in decorated] 
+0

jest to szybsze, ponieważ w rzeczywistości zrobił mniej podciągu [10:] w porównaniu z poprzednim? – zinking

+0

@zinking, prawie tyle. 'cmp' jest nazywane' n * log (n) 'razy, więc' returnlastchar' będzie nazywane '2 * n * log (n)' razy. –

0

Możesz napisać własną sorted() tak:

try: 
    sorted 
except NameError: 
    def sorted(seq, key=None): 
     lst = list(seq) # get copy of list 
     if key is not None: 
      def my_cmp(a, b): 
       return cmp(key(a), key(b)) 
     else: 
      my_cmp = cmp 
     lst.sort(my_cmp) 
     return lst 

To będzie definiować tylko twój nowy sorted(), jeśli nie ma wbudowanego sorted(). Najpierw próbujemy ocenić nazwę sorted, a jeśli otrzymamy numer NameError, zdefiniujemy naszą własną. Używam map(None, seq) jako szybkiego sposobu na utworzenie nowej listy z wartości seq.

Lub, jeśli chcemy użyć Transformacja Schwartza dla maksymalnej wydajności jak sugeruje @gnibbler:

try: 
    sorted 
except NameError: 
    import operator as op 
    def sorted(seq, key=None): 
     if key is not None: 
      lst = [(key(x), x) for x in seq] 
      lst.sort() 
      return map(lambda x: x[1], lst) 
     else: 
      lst = list(seq) # get list from sequence 
      lst.sort() 
      return lst 
+0

Nie sądzę, że 'itemgetter' został wprowadzony do wersji Python 2.4. – DSM

+0

@ DS: Oh, dziękuję. Napiszę ponownie zwykłą 'lambda'. – steveha

1

To nie jest trudno napisać masz własną wersję posortowane. Tutaj jest zastąpienie drop-in (z wyłączeniem cmp paramenter):

def _count(): 
    i = 0 
    while 1: 
     yield i 
     i += 1 

def sorted(iterable, key=None, reverse=False): 
    'Drop-in replacement for the sorted() built-in function (excluding cmp())' 
    seq = list(iterable) 
    if reverse: 
     seq.reverse() 
    if key is not None: 
     seq = zip(map(key, seq), _count(), seq) 
    seq.sort() 
    if key is not None: 
     seq = map(lambda decorated: decorated[2], seq) 
    if reverse: 
     seq.reverse() 
    return seq