2012-07-03 3 views
6

В новой Python, я могу использовать отсортированный функцию легко и сортирует список строки в соответствии с их последние несколько символов, как, например:Python Сортировка Последние символы

lots_list=['anything'] 

print sorted(lots_list, key=returnlastchar) 

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

Как я могу реализовать выше lots_list.sort(), который используется в более ранних версиях Python (2.3)?

"Ошибка: Когда я попытался с помощью sorted(), the global name sorted is not defined."

Спасибо!

+4

сколько лет ваш старший питон? – lucemia

+0

2.3 Я думаю. Кажется, я не могу сортировать(). Только .sort() –

ответ

5

У меня нет Python 2.3 на руке, однако, согласно этому сообщению Sorting a list of lists by item frequency in Python 2.3http://docs.python.org/release/2.3/lib/typesseq-mutable.html Этот метод также работает для вас.

def mycmp(a, b): 
    return cmp(a[10:], b[10:]) 

lots_list.sort(mycmp) 
+1

Спасибо lucemia. Умственная нота к себе, .sort() может принимать функцию! –

8

Schwartzian transform обычно более эффективно, чем при использовании cmp аргумента (это то, что новые версии Python сделать при использовании key аргумента)

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

это быстрее, потому что на самом деле меньше подстроки [10:] по сравнению с предыдущей? – zinking

+0

@zinking, почти все. 'cmp' называется' n * log (n) 'раз, поэтому' returnlastchar' будет называться '2 * n * log (n)' раз. –

0

Вы можете написать свой собственный sorted() так:

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 

Это будет определять только ваш новый sorted(), если нет встроенного sorted(). Сначала мы попытаемся оценить имя sorted, и если мы получим NameError, мы определим наш собственный. Я использую map(None, seq) как быстрый способ сделать новый список из значений seq.

Или, если мы хотим использовать Шварц преобразование для достижения максимальной эффективности в соответствии с предложением @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

Я не думаю, что 'itemgetter' был введен до Python 2.4. – DSM

+0

@ DSM: О, спасибо. Я переписал бы с обычной лямбдой. – steveha

1

Это не трудно написать вы собственную версию отсортированного. Вот капля в замене (за исключением КСС 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 
Смежные вопросы