[python] Accedere all'indice in cicli 'for'?



Answers

Usando un ciclo for, come posso accedere all'indice del ciclo, da 1 a 5 in questo caso?

Usa enumerate per ottenere l'indice con l'elemento durante l'iterazione:

for index, item in enumerate(items):
    print(index, item)

E nota che gli indici di Python partono da zero, quindi otterrai 0 a 4 con quanto sopra. Se vuoi il conteggio, da 1 a 5, fai questo:

for count, item in enumerate(items, start=1):
    print(count, item)

Flusso di controllo unidiomatico

Quello che chiedi è l'equivalente Python di quanto segue, che è l'algoritmo utilizzato dalla maggior parte dei programmatori di linguaggi di livello inferiore:

index = 0            # Python's indexing starts at zero
for item in items:   # Python's for loops are a "for each" loop 
    print(index, item)
    index += 1

O in lingue che non hanno un ciclo for-each:

index = 0
while index < len(items):
    print(index, items[index])
    index += 1

o qualche volta più comunemente (ma unidiomaticamente) trovato in Python:

for index in range(len(items)):
    print(index, items[index])

Utilizzare la funzione Enumerazione

La funzione di enumerate di Python riduce il disordine visivo nascondendo la contabilità per gli indici e incapsulando l'iterabile in un altro iterabile (un oggetto enumerate ) che produce una tupla di due elementi dell'indice e l'elemento che l'originale iterabile fornirebbe. Questo sembra:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

Questo esempio di codice è abbastanza bene l'esempio canonical della differenza tra codice che è idiomatico di Python e codice che non lo è. Il codice idiomatico è sofisticato (ma non complicato) Python, scritto nel modo in cui era destinato ad essere usato. Il codice idiomatico è previsto dai progettisti del linguaggio, il che significa che di solito questo codice non è solo più leggibile, ma anche più efficiente.

Ottenere un conteggio

Anche se non hai bisogno di indici mentre vai, ma hai bisogno di un conteggio delle iterazioni (a volte desiderabili) puoi iniziare con 1 e il numero finale sarà il tuo conteggio.

for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

Il conteggio sembra essere più quello che intendi chiedere (al contrario dell'indice) quando hai detto che volevi dall'1 al 5.

Abbattendolo - una spiegazione passo passo

Per interrompere questi esempi, diciamo che abbiamo un elenco di elementi che vogliamo ripetere con un indice:

items = ['a', 'b', 'c', 'd', 'e']

Ora passiamo questo iterabile per enumerare, creando un oggetto enumerare:

enumerate_object = enumerate(items) # the enumerate object

Possiamo estrarre il primo elemento da questo iterabile che avremmo ottenuto un ciclo con la funzione next :

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

E vediamo che otteniamo una tupla di 0 , il primo indice e 'a' , il primo elemento:

(0, 'a')

possiamo usare quello che viene chiamato " decompressione della sequenza " per estrarre gli elementi da questa doppia tupla:

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

e quando ispezioniamo l' index , troviamo che si riferisce al primo indice, 0, e l' item riferisce al primo elemento, 'a' .

>>> print(index)
0
>>> print(item)
a

Conclusione

  • Gli indici Python partono da zero
  • Per ottenere questi indici da un iterabile mentre si itera su di esso, utilizzare la funzione enumerate
  • L'uso dell'enumerazione in modo idiomatico (insieme alla tuple decompressione) crea un codice che è più leggibile e mantenibile:

Quindi fai questo:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)
Question

Come posso accedere all'indice stesso per un elenco come il seguente?

ints = [8, 23, 45, 12, 78]

Quando lo passo attraverso un ciclo for , come posso accedere all'indice del ciclo, da 1 a 5 in questo caso?




Puoi anche provare questo:

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

L'output è

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']



Puoi farlo con questo codice:

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value

Utilizzare questo codice se è necessario ripristinare il valore dell'indice alla fine del ciclo:

ints = [8, 23, 45, 12, 78]
index = 0

for value in (ints):
    index +=1
    print index, value
    if index >= len(ints)-1:
        index = 0



ints = [9, 23, 45, 12, 78]
ints.extend([1,2,3,4,5,6,7,8])
for idx, val in enumerate(ints):
    print(idx,val)

In questo modo puoi estendere un elenco. Estendi significa che puoi aggiungere più valori alla volta.

Per aggiungere questo elenco devi scrivere il codice riportato di seguito:

ints = [9, 23, 45, 12, 78]
ints.append([1])
for idx, val in enumerate(ints):
    print(idx,val)

In questo modo puoi aggiungere un singolo valore alla volta. Se scrivi ints.append([1]) , questo creerà un sottoelenco per questo elemento.




Prima di tutto, gli indici saranno da 0 a 4. I linguaggi di programmazione iniziano a contare da 0; non dimenticarlo o ti imbatterai in un indice fuori limite. Tutto ciò di cui hai bisogno nel ciclo for è un conteggio variabile da 0 a 4 in questo modo:

for x in range(0, 5):

Tieni presente che ho scritto da 0 a 5 perché il loop arresta un numero prima del massimo. :)

Utilizzare il valore di un indice

list[index]



Modo antiquato:

for ix in range(len(ints)):
    print ints[ix]

Comprensione delle liste:

[ (ix, ints[ix]) for ix in range(len(ints))]

>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
... 
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
...     print tup
... 
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>> 



for i in range(len(ints)):
   print i, ints[i]



Hai ricevuto un certo numero di risposte che spiegano enumerate , ma se hai solo bisogno dell'indice per accedere alle voci corrispondenti in due elenchi, c'è un altro modo più semplice e pulito in Python 3: zip .

Ad esempio, se stai utilizzando l'indice per estrarre i nomi corrispondenti per i numeri nel tuo elenco, puoi farlo in questo modo:

ints = [8, 23, 45, 12, 78]
names = ["John", "Sue", "Johannes", "Patel", "Ian"]
for int, name = zip(ints, names):
    print("{} - {}".format(name, int)

Ciò produrrebbe

8 - John
23 - Sue
45 - Johannes
12 - Patel
78 - Ian





Links