2009-08-06 5 views
8

Pour les tableaux et les listes en Python et Numpy sont les lignes suivantes équivalentes:Est-ce que 'for x in array' donne toujours x? [Python/NumPy]

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

et:

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

Je suis intéressé par l'ordre de Liste de produits. Dans quelques exemples que j'ai essayé ils sont identiques, mais est-ce garanti? Par exemple, je sais que l'instruction foreach en C# ne garantit pas l'ordre, et que je devrais être prudent avec elle.

+0

Vouliez-vous dire: pour j dans la gamme (len (myarray)):? – clawrence

+0

Oups, oui je voulais dire jeter dans une gamme() – Chris

Répondre

10

Il est garanti pour les listes. Je pense que le plus pertinent Python parallèle à votre exemple C# serait d'itérer sur les clés dans un dictionnaire, qui n'est pas garanti d'être dans n'importe quel ordre.

# 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 structure for <element> in <iterable> inquiète seulement que le iterable fournit une fonction next() qui retourne quelque chose. Il n'y a aucune garantie générale que ces éléments soient retournés dans n'importe quel ordre sur le domaine de l'instruction for..in; les listes sont un cas particulier.

+1

Merci de souligner que les tableaux ont une notion d'ordre, qu'il est implémenté via la fonction next(). La structure for ... in ... tire avantage de next(), et les données avec un ordre intrinsèque (tableaux) implémente next() différemment des données sans ordre intrinsèque (comme les dictionnaires). – Chris

10

Oui, c'est entièrement garanti. for item in myarray (où myarray est une séquence , qui comprend des réseaux de numpy, des listes prédéfinies, les array.arrays de python, etc etc), est en fait équivalent en Python à:

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

pour une variable fantôme _aux ;-) . BTW, vos deux constructions sont également équivalentes à

itemlist = list(myarray) 
+0

Merci! Ouais, je n'essayais pas vraiment de convertir un tableau en liste, juste en explorant l'ordre. – Chris

6

Oui, les Python Language Reference garantit ce (l'accent est à moi):

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

« La suite est alors exécutée une fois pour chaque élément fourni par l'itérateur , dans l'ordre des indices ascendants. "