2009-08-17 8 views
26

Al usar una lista de comprensión, ¿está garantizado de alguna manera el orden de la nueva lista? Como un ejemplo inventado, es el siguiente comportamiento garantizado por la definición de una lista por comprensión:¿Está garantizado el orden de los resultados provenientes de una lista de comprensión?

>> a = [x for x in [1,2,3]] 
>> a 
[1, 2, 3] 

Igualmente, es la siguiente igualdad garantizada:

>> lroot = [1, 2, 3] 
>> la = [x for x in lroot] 
>> lb = [] 
>> for x in lroot: 
    lb.append(x) 
>> lb == la 
True 

En concreto, es el pedido que me interesa aquí.

+2

Sí, está garantizado. Es una secuencia – hughdbrown

Respuesta

28

Sí, la comprensión de la lista conserva el orden del iterable original (si lo hay). Si se ordena el iterable original (lista, tupla, archivo, etc.), ese es el orden que obtendrá en el resultado. Si su iterable no está ordenado (set, dict, etc.), no hay garantías sobre el orden de los artículos.

+1

Con sets y dicts, creo que hay una garantía de que el pedido no cambiará si los datos no cambian. p.ej. dado un conjunto 's', lo siguiente siempre será verdadero:' [x para x en s] == [x para x en s] '. –

+0

¿Eso también significa que la ejecución de la comprensión es en ese orden? Es decir. will [x para x en s si p (x)] llama p (x) en el orden de s o podría (aunque solo sea teóricamente) que esté en un orden diferente y el resultado de alguna manera "ordenado" de nuevo al orden correcto después ? –

3

Sí, una lista es una secuencia. El orden de la secuencia es significativo.

Cuestiones relacionadas