2016-06-28 16 views
6

Czy zwykłe oświadczenie za/w gwarantuje, że lista jest iterowana w kolejności?Czy konstrukcja pętli for/in zachowuje porządek?

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

To jest pętla powyżej gwarantowany wydrukować 5 4 3 2 za każdym razem?

+1

Tak, powinna, za każdym razem, ponieważ listy są uporządkowane. –

+0

Jeśli przeprowadzasz iterację nad 'dict', kolejność może być inna niż oczekiwana. Dicts Pythona są nieuporządkowane. – dawg

+0

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

Odpowiedz

10

Kolejność iteracji pętli jest kontrolowana przez dowolny obiekt, który iteruje. Iterowanie nad zamówioną kolekcją, taką jak list, gwarantuje iteracje nad elementami w kolejności na liście, ale iterowanie po nieuporządkowanej kolekcji, takiej jak set, gwarantuje niemalże brak zamówień.

2

Po przejrzeniu sekwencji (listy, krotki itp.) Kolejność jest gwarantowana. Struktury haczykowe (dict, set itp.) Mają swoje własne zamówienie - ale dla danej struktury kolejność będzie taka sama za każdym razem. Jeśli dodasz lub usuniesz element, kolejność może być inna.


Rozważmy kod folloing: Robię zestaw pięciu elementów, a następnie wydrukować go z czterech identycznych dla pętli. Kolejność jest taka sama. Następnie dodaję dwa elementy; to zakłóca porządek.

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" 

wyjściowa:

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 

Uwaga jak oryginalne elementy nie są już w tej samej kolejności, to: "Kolacja" teraz przychodzi po "Apple".

+2

"za każdym razem" zasługuje na odrobinę opracowania. W ramach pojedynczego uruchomienia programu Python, iterowanie przez dyktowanie lub ustawienie dwa razy bez zmiany spowoduje wygenerowanie tej samej kolejności, ale iteracja nad "tym samym" dyktatem lub ustawiona w dwóch różnych przebiegach programu może spowodować powstanie dwóch różnych zamówień. – user2357112

+1

Nawet jeśli obecnie zamówienie jest zachowywane podczas wielokrotnej iteracji w zestawie, nie jest to gwarantowane i nie należy na niego polegać. Jeśli zamówienie jest ważne, należy wybrać bazę danych, która gwarantuje zamówienie. – syntonym

+0

@ user2357112: Dzięki; Dodałem przykład do zilustrowania. – Prune

1

Jeśli chcesz go przetestować siebie:

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) 

I właśnie dla przypadku sterowania:

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

Heh, próbowałem go sam. Stąd moje pytanie. Ale od tego czasu odkryłem mój błąd. ;-) –

1

przypadku list, tak, ponieważ są one uporządkowane struktury danych w Pythonie.

Powiązane problemy