É 'para x no array' sempre resultam em ordenada x? [Python / NumPy]
Pergunta
Para matrizes e listas em Python e Numpy são as linhas seguinte equivalentes:
itemlist = []
for j in range(len(myarray)):
item = myarray[j]
itemlist.append(item)
e
itemlist = []
for item in myarray:
itemlist.append(item)
Eu estou interessado no fim de ITEMLIST. Em alguns exemplos que eu tentei eles são idênticos, mas é garantida ? Por exemplo, eu sei que a declaração foreach
em C # não ordena garantia, e que eu deveria ter cuidado com ele.
Solução
É garantido para listas. Eu acho que o Python paralelo mais relevantes para o seu C exemplo # seria para iterar sobre as chaves em um dicionário, o que não é garantido para estar em qualquer ordem.
# 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
A estrutura for <element> in <iterable>
única teme que os suprimentos iterable
uma função next()
que retorna algo. Não há nenhuma garantia geral de que estes elementos se voltou em qualquer ordem sobre o domínio da declaração for..in
; listas são um caso especial.
Outras dicas
Sim, é totalmente garantida. for item in myarray
(onde myarray
é um sequência , que inclui matrizes de numpy, incorporado listas, array.arrays do Python, etc, etc), é na verdade equivalente em Python para:
_aux = 0
while _aux < len(myarray):
item = myarray[_aux]
...etc...
para alguma variável _aux
fantasma ;-). Btw, ambas as construções também são equivalentes a
itemlist = list(myarray)
Sim, a Python Language Reference garante este (a ênfase é minha) :
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
"O conjunto é então executada uma vez para cada item fornecido pelo iterator, na ordem de ascendente índices . "