2009-08-17 4 views
26

Lorsque vous utilisez une compréhension de liste, l'ordre de la nouvelle liste est-il garanti de quelque façon que ce soit? A titre d'exemple artificiel, est le comportement suivant garanti par la définition d'une compréhension de la liste:L'ordre des résultats provenant d'une compréhension de liste est-il garanti?

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

De même, est l'égalité suivante garantie:

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

Plus précisément, il est l'ordre que je suis intéressé par ici.

+2

Oui, c'est garanti. C'est une séquence. – hughdbrown

Répondre

28

Oui, la compréhension de liste préserve l'ordre de l'itérable original (s'il y en a un). Si l'itérable original est commandé (liste, tuple, fichier, etc.), c'est l'ordre que vous obtiendrez dans le résultat. Si votre itérable n'est pas ordonné (set, dict, etc.), il n'y a aucune garantie sur l'ordre des items.

+1

Avec des ensembles et des dicts, je crois qu'il y a une garantie que la commande ne changera pas si les données ne changent pas. par exemple. étant donné un ensemble 's', ce qui suit sera toujours vrai:' [x pour x dans s] == [x pour x dans s] '. –

+0

Est-ce que cela signifie également que l'exécution de la compréhension est dans cet ordre? C'est à dire. will [x pour x dans s si p (x)] appelle p (x) dans l'ordre de s ou pourrait (même si ce n'est que théoriquement) être dans un ordre différent et le résultat en quelque sorte "trié" dans l'ordre correct ? –

3

Oui, une liste est une séquence. L'ordre des séquences est significatif.

Questions connexes