Всегда ли 'for x in array' приводит к отсортированному x?[В Python/NumPy И Обратно]
Вопрос
Для массивов и списков в Python и Numpy эквивалентны следующие строки:
itemlist = []
for j in range(len(myarray)):
item = myarray[j]
itemlist.append(item)
и:
itemlist = []
for item in myarray:
itemlist.append(item)
Я заинтересован в порядок из списка элементов.В нескольких примерах, которые я пробовал, они идентичны, но так ли это гарантированный?Например, я знаю, что foreach
оператор в C # не гарантирует порядок, и я должен быть осторожен с ним.
Решение
Это гарантировано для списков.Я думаю, что более уместной параллелью Python вашему примеру с C # было бы перебирать ключи в словаре, которые НЕ обязательно должны быть в каком-либо порядке.
# Always prints 0-9 in order
a_list = [0,1,2,3,4,5,6,7,8,9]
for x in a_list:
print x
# May or may not print 0-9 in order. Implementation dependent.
a_dict = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
for x in a_dict:
print x
В for <element> in <iterable>
структура беспокоится только о том, что iterable
поставляет a next()
функция, которая возвращает что-то.Нет никакой общей гарантии, что эти элементы будут возвращены в любом порядке по домену for..in
заявление;списки - это особый случай.
Другие советы
Да, это полностью гарантировано. for item in myarray
(где myarray
является последовательность, который включает массивы numpy, встроенные списки, Python's array.arrays и т.д. и т.п.), Фактически эквивалентен в Python:
_aux = 0
while _aux < len(myarray):
item = myarray[_aux]
...etc...
для некоторой фантомной переменной _aux
;-).Кстати, обе ваши конструкции также эквивалентны
itemlist = list(myarray)
Да, тот Ссылка на язык Python гарантирует это (курсив мой):
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
"Тогда люкс выполняется один раз для каждого элемента предусмотрено итератор, в порядке возрастания индексов."