2009-08-06 10 views
8

Para las matrices y listas en Python y Numpy son las líneas siguiendo equivalente:¿'x para la matriz' siempre da como resultado x ordenado? [Python/NumPy]

itemlist = [] 
for j in range(len(myarray)): 
    item = myarray[j] 
    itemlist.append(item) 

y:

itemlist = [] 
for item in myarray: 
    itemlist.append(item) 

Estoy interesado en el fin de ITEMLIST. En algunos ejemplos que he probado, son idénticos, pero ¿está garantizado? Por ejemplo, sé que la declaración foreach en C# no garantiza el orden, y que debería tener cuidado con ello.

+0

Quizás quiso decir: for j in range (len (myarray)):? – clawrence

+0

Vaya, sí, quise lanzar en un rango() – Chris

Respuesta

10

Se garantiza para las listas. Creo que el Python paralelo más relevante a su ejemplo de C# sería iterar sobre las teclas en un diccionario, lo cual NO está garantizado en ningún orden.

# 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 

La estructura for <element> in <iterable> sólo se preocupa de que el iterable suministra una función next() que devuelve algo. No hay garantía general de que estos elementos se devuelvan en cualquier orden sobre el dominio de la declaración for..in; las listas son un caso especial.

+1

Gracias por destacar que las matrices tienen una noción de orden, que se implementa a través de la función next(). La estructura ... en ... aprovecha next(), de modo que los datos con un orden intrínseco (arrays) implementan next() de forma diferente a los datos sin un orden intrínseco (como los diccionarios). – Chris

10

Sí, está completamente garantizado. for item in myarray (donde myarray es una secuencia , que incluye matrices de numpy, listas incorporadas, array.arrays de Python, etc, etc), es, de hecho, equivalente en Python a:

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

para alguna variable fantasma _aux ;-) . Por cierto, ambos de sus construcciones también son equivalentes a

itemlist = list(myarray) 
+0

¡Gracias! Sí, realmente no estaba tratando de convertir una matriz en una lista, simplemente explorando el orden. – Chris

6

Sí, los Python Language Reference garantiza este (el subrayado es mía):

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

"La suite se ejecuta entonces una vez para cada elemento proporcionado por el iterador , en el orden de los índices ascendentes. "

Cuestiones relacionadas