2012-07-11 20 views
11

Noté algo que no esperaba al escribir un guión esta mañana. Traté de usar una lista de comprensión y ordenar todo en una declaración y obtuve un resultado sorprendente. El código siguiente resume mi caso de uso general, pero se ha simplificado para esta pregunta:Ordenando una lista Comprensión en una declaración

Transaction = namedtuple('Transaction', ['code', 'type']) 

my_list = [Transaction('code1', 'AAAAA'), Transaction('code2', 'BBBBB'), Transaction('code3', 'AAAAA')] 

types = ['AAAAA', 'CCCCC'] 

result = [trans for trans in my_list if trans.type in types].sort(key = lambda x: x.code) 

print result 

Salida:

None 

Si creo la lista mediante la comprensión, a continuación, ordenar después del hecho, todo está multa. Tengo curiosidad de por qué sucede esto?

+2

los métodos 'sort' ordenan la lista * in-place * y luego devuelven' None'. – sloth

Respuesta

21

El método list.sort() es clasificar la lista en su lugar, y como todos los métodos de mutación que devuelve None. Use la función incorporada sorted() para devolver una nueva lista ordenada.

result = sorted((trans for trans in my_list if trans.type in types), 
       key=lambda x: x.code) 

En lugar de lambda x: x.code, también se puede utilizar el operator.attrgetter("code") ligeramente más rápido.

0

desea la función integrada sorted. El método sort ordena una lista y devuelve None.

result = sorted([trans for trans in my_list if trans.type in types],key = lambda x: x.code) 

esto se podría hacer un poco mejor por:

import operator 
result = sorted((trans for trans in my_list if trans.type in types), key=operator.attrgetter("code")) 
+0

Tenga en cuenta que pasar una lista de comprensión a 'sorted()' da como resultado una copia de la lista que se está realizando. Esto no es necesariamente más lento, pero podría resultar en un mayor consumo de memoria. –

+0

Debe encerrar la expresión del generador entre paréntesis. –

+0

@SvenMarnach - No necesitas paréntesis, ¿o sí? 'ordenado (x para x en xrange (10))' funciona bien para mí – mgilson

2

Llamar a .sort en una lista devuelve None. Tiene perfecto sentido que este resultado se asigne a result.

En otras palabras, se crea una lista anónima con una lista por comprensión, a continuación, llamar .sort, y la lista se pierde mientras que el resultado de la llamada .sort se almacena en la variable result.

Como han dicho otros, debe usar la función integrada sorted() para devolver una lista. (sorted() devuelve una copia ordenada de la lista.)

Cuestiones relacionadas