2016-06-28 13 views
6

Una dichiarazione for/ordinaria garantisce che l'elenco sia iterato nell'ordine?Il costrutto loop for/in conserva l'ordine?

my_list = [5,4,3,2] 
for i in my_list 
    print(i) 

Cioè, il ciclo sopra è garantito per stampare 5 4 3 2 ogni volta?

+1

Sì, dovrebbe, ogni volta, poiché gli elenchi sono ordinati. –

+0

Se si sta iterando su un 'dict', l'ordine potrebbe essere diverso da quello previsto. I dit Python non sono ordinati. – dawg

+0

Vedere https://docs.python.org/2/reference/compound_stmts.html#the-for -mentation – jarmod

risposta

10

A for l'ordine di iterazione del ciclo è controllato da qualsiasi oggetto stia passando. L'iterazione su una raccolta ordinata come una list è garantita per iterare su elementi nell'ordine della lista, ma l'iterazione su una collezione non ordinata come una set non garantisce quasi nessun ordine.

2

Quando si itera su una sequenza (elenco, tupla, ecc.), L'ordine è garantito. Le strutture tratteggiate (dict, set, ecc.) Hanno il loro ordine - ma per una data struttura, l'ordine sarà sempre lo stesso. Se aggiungi o cancelli un elemento, l'ordine potrebbe essere diverso.


Si consideri il codice folloing: Faccio una serie di cinque elementi, e quindi stamparlo con quattro identici per loop. L'ordine è lo stesso Quindi aggiungo due elementi; questo sconvolge l'ordine.

my_set = set(["Apple", "Banana", "Casaba", "Dinner", "Eggplant"]) 

for food in my_set: 
    print food, 
print "\n" 

for food in my_set: 
    print food, 
print "\n" 

for food in my_set: 
    print food, 
print "\n" 

for food in my_set: 
    print food, 
print "\n" 

my_set.add("Fruitcacke") 
my_set.add("Grape") 

for food in my_set: 
    print food, 
print "\n" 

uscita:

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Fruitcacke Grape Apple Dinner Eggplant Banana 

Si noti come gli elementi originali non sono più nello stesso ordine sono: "La cena" ora viene dopo "Apple".

+2

"ogni volta" merita un po 'di elaborazione. All'interno di una singola esecuzione di un programma Python, l'iterazione su un dict o l'impostazione due volte senza la modifica produrrà lo stesso ordine, ma l'iterazione su "lo stesso" dettato o impostato in due diverse esecuzioni del programma potrebbe produrre due ordini diversi. – user2357112

+1

Anche se attualmente l'ordine viene conservato ripetendo più volte su un set, questo non è garantito e non dovrebbe essere invocato. Se l'ordine è importante, è necessario scegliere una struttura dati che garantisca l'ordine. – syntonym

+0

@ user2357112: Grazie; Ho aggiunto un esempio per illustrare. – Prune

1

Se si desidera verificare voi stessi:

my_list = [5,4,3,2] 

for _ in range(20): 
    new_list = [] 
    for i in my_list: 
     new_list.append(i) 
    print(my_list == new_list) 

E solo per un caso di controllo:

print([2,4,5,3] == my_list) 
+0

Heh, ci ho provato anch'io. Quindi la mia domanda. Ma da allora ho scoperto il mio errore. ;-) –

1

Per le liste, sì, dal momento che sono ordinate strutture di dati in Python.

Problemi correlati