Является ли «для х в массиве» всегда приводит к сортировке х? [Python / NumPy] - PullRequest
9 голосов
/ 06 августа 2009

Для массивов и списков в 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 # не гарантирует порядок, и что я должен быть осторожен с ним.

Ответы [ 3 ]

10 голосов
/ 06 августа 2009

Это гарантировано для списков. Я думаю, что более уместным 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 предоставляет функцию next(), которая возвращает что-то. Нет общей гарантии, что эти элементы будут возвращены в любом порядке по домену оператора for..in; списки являются особым случаем.

10 голосов
/ 06 августа 2009

Да, это полностью гарантировано. for item in myarray (где myarray - это последовательность , которая включает в себя массивы, встроенные списки, массивы Python, массивы. Etc и т. Д.), Фактически эквивалентна в Python:

_aux = 0
while _aux < len(myarray):
  item = myarray[_aux]
  ...etc...

для некоторой фантомной переменной _aux ;-). Кстати, обе ваши конструкции также эквивалентны

itemlist = list(myarray)
6 голосов
/ 06 августа 2009

Да, Справочник по языку Python гарантирует это (выделение мое):

 for_stmt ::=  "for" target_list "in" expression_list ":" suite
               ["else" ":" suite]

"Затем набор выполняется один раз для каждого элемента, предоставленного итератор, в порядке возрастания индексов . "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...