2012-07-03 14 views
6

En reciente Python, yo soy capaz de utilizar la función ordenados y fácilmente ordena una lista de cadena de acuerdo con sus últimos caracteres como por ejemplo:Python Ordenar últimos caracteres

lots_list=['anything'] 

print sorted(lots_list, key=returnlastchar) 

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

¿Cómo puedo aplicar lo anterior a lots_list.sort() que se usa en versiones anteriores de Python (2.3)?

"Error: Cuando he intentado usar sorted(), the global name sorted is not defined."

Gracias!

+4

qué edad es su pitón más viejo? – lucemia

+0

2.3 Creo. No puedo usar sorted(). Sólo .sort() –

Respuesta

8

El Schwartzian transform suele ser más eficaz que utilizar el cmp argumento (Esto es lo que las nuevas versiones de Python hacen cuando se utiliza el argumento 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

¿es esto más rápido porque en realidad hizo menos subcadena a [10:] en comparación con la anterior? – zinking

+0

@zinking, casi. 'cmp' se llama' n * log (n) 'veces, por lo que' returnlastchar' se llamaría '2 * n * log (n)' veces. –

0

Usted puede escribir su propio sorted() así:

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 

Esto solo definirá su nuevo sorted() si no hay incorporado sorted(). Primero, tratamos de evaluar el nombre sorted y si obtenemos un NameError definimos el nuestro. Estoy usando map(None, seq) como una manera rápida de hacer una nueva lista de los valores de seq.

O, si queremos utilizar el Schwartzian Transform para una máxima eficiencia según lo sugerido por @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

No creo que 'itemgetter' se haya introducido hasta Python 2.4. – DSM

+0

@DSM: Oh, gracias. Voy a reescribir con el habitual 'lambda'. – steveha

1

No es difícil escribir que eres versión propia de ordenados. Aquí es una gota en el reemplazo (excluyendo el 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 
Cuestiones relacionadas