2016-06-28 2 views
6

Выполняет ли обычное для/in утверждение, что список итерируется по порядку?Сохраняет ли конструкция for/in loop порядок?

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

То есть, цикл выше гарантированно печати 5 4 3 2 каждый раз?

+1

Да, это необходимо, каждый раз, поскольку списки упорядочены. –

+0

Если вы выполняете итерацию по 'dict', порядок может отличаться от ожидаемого. Python dicts неупорядочены. – dawg

+0

См. Https://docs.python.org/2/reference/compound_stmts.html#the-for-statement – jarmod

ответ

10

A for Порядок итераций цикла, управляемый любым объектом, который он итерирует. Итерирование над упорядоченной коллекцией, например, list, гарантировано для повторения элементов в списке, но повторение по неупорядоченной коллекции, например, set, практически не гарантирует порядок.

2

Когда вы перебираете последовательность (список, кортеж и т. Д.), Заказ гарантирован. Хешированные структуры (dict, set и т. Д.) Имеют свой собственный порядок - но для данной структуры порядок будет одинаковым каждый раз. Если вы добавляете или удаляете элемент, порядок может отличаться.


Рассмотрим код folloing: Я сделать набор из пяти элементов, а затем распечатать его с четырьмя одинаковыми для петель. Порядок тот же. Затем я добавляю два элемента; это нарушает порядок.

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" 

Выход:

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 

Обратите внимание, как оригинальные элементы больше не в том же порядке: «Ужин» теперь приходит после того, как «Яблоко».

+2

«каждый раз» заслуживает некоторой разработки. В течение одного запуска программы Python повторение итерации по битам или набору дважды без изменения приведет к тому же порядку, но повторение «одного и того же» dict или набора в двух разных прогонах программы может привести к двум различным порядкам. – user2357112

+1

Даже если в настоящий момент заказ сохраняется при повторении нескольких раз по набору, это не гарантируется и на него нельзя положиться. Если порядок важен, следует выбрать структуру данных, которая гарантирует порядок. – syntonym

+0

@ user2357112: Спасибо; Я добавил пример для иллюстрации. – Prune

1

Если вы хотите проверить это самостоятельно:

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) 

И только для случая управления:

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

Хе-хе, я сам это пробовал. Отсюда мой вопрос. Но с тех пор я обнаружил свою ошибку. ;-) –

1

Для списков, да, так как они упорядоченные структуры данных в Python.

Смежные вопросы