Ordenar una lista de comprensión en una statement

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

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 utilizando la comprensión, luego la ordeno después del hecho, todo está bien. Tengo curiosidad por qué sucede esto?

El método list.sort() está ordenando la lista en su lugar, y como todos los métodos de mutación 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 puede usar operator.attrgetter("code") ligeramente más rápido.

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

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

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

quieres la función incorporada sorted El método de sort ordena una lista en su lugar y devuelve None .

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

Esto podría hacerse un poco mejor por:

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