2009-08-06 8 views
8

Per gli array e le liste in Python e Numpy sono i seguenti linee equivalenti:E 'per x in array' sempre risultato x ordinato? [Python/NumPy]

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

e:

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

Mi interessa il ordine di ITEMLIST. In alcuni esempi che ho provato sono identici, ma è garantito? Ad esempio, so che l'istruzione foreach in C# non garantisce l'ordine e che dovrei fare attenzione.

+0

Intendevi: per j nella portata (len (myarray)):? – clawrence

+0

Oops, sì, ho voluto dire di inserire un intervallo() – Chris

risposta

10

È garantito per gli elenchi. Penso che il Python più rilevante parallelo al tuo esempio C# sia quello di scorrere le chiavi in ​​un dizionario, che NON è garantito in alcun ordine.

# 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 struttura for <element> in <iterable> preoccupa solo che il iterable fornisce una funzione next() che restituisce qualcosa. Non vi è alcuna garanzia generale che questi elementi vengano restituiti in qualsiasi ordine sul dominio dell'istruzione for..in; le liste sono un caso speciale.

+1

Grazie per aver evidenziato che gli array hanno una nozione di ordine, che è implementato tramite la funzione next(). La struttura for ... in ... sfrutta next(), e quindi i dati con un ordine intrinseco (matrici) implementano next() diversamente dai dati senza un ordine intrinseco (come i dizionari). – Chris

10

Sì, è completamente garantito. for item in myarray (dove myarray è una sequenza , che comprende le matrici di NumPy, elenchi built, array.arrays di Python, ecc ecc), è infatti equivalente in Python per:

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

per qualche variabile phantom _aux ;-) . Btw, entrambi i vostri costrutti sono anche equivalente a

itemlist = list(myarray) 
+0

Grazie! Sì, non stavo davvero cercando di convertire una matrice in una lista, semplicemente esplorando l'ordine. – Chris

6

Sì, i Python Language Reference garanzie questo (corsivo è mio):

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

"La suite viene poi eseguito una volta per ogni elemento fornito da l'iteratore , nell'ordine degli indici ascendenti. "