Iterar uma lista com índices em Python

203

Eu poderia jurar que vi a função (ou método) que pega uma lista como essa [3, 7, 19]e a torna uma lista iterável de tuplas, assim: [(0,3), (1,7), (2,19)]para usá-la em vez de:

for i in range(len(name_of_list)):
    name_of_list[i] = something

mas não me lembro do nome e a "lista de iterações" do Google não recebe nada.

Slava V
fonte

Respostas:

354
>>> a = [3,4,5,6]
>>> for i, val in enumerate(a):
...     print i, val
...
0 3
1 4
2 5
3 6
>>>
Vinko Vrsalovic
fonte
107

Sim, essa seria a enumeratefunção! Ou, mais precisamente, você precisa fazer:

list(enumerate([3,7,19]))

[(0, 3), (1, 7), (2, 19)]
PierreBdR
fonte
2
às vezes as pessoas fazem uma pergunta relacionada com a que realmente desejam; outras, são um tanto indiscriminadas sobre o que "melhor" significa.
msw
3
E, às vezes, as pessoas leem apenas as primeiras linhas e meia da pergunta em vez de toda a questão. Se você chegar ao final da segunda linha, ele diz que quer usá-la em vez de for i in range(len(name_of_list)):qual é o que me levou a fornecer um exemplo usando a para em vez do que foi mostrado na primeira parte.
Vinko Vrsalovic 27/09/12
1
@HumphreyBogart Porque Lauren Bacall gosta de ser mais detalhada.
Javadba
25

Aqui está outro usando a zipfunção

>>> a = [3, 7, 19]
>>> zip(range(len(a)), a)
[(0, 3), (1, 7), (2, 19)]
S.Lott
fonte
10
enumerate()é um pouco mais elegante, eu acho.
18419 Nathan Fellman
14
@ Nathan: Mas o zip () é mais geral e funciona para pares arbitrários de listas, por isso é bom saber.
ShreevatsaR
8

Aqui está uma solução usando a função map:

>>> a = [3, 7, 19]
>>> map(lambda x: (x, a[x]), range(len(a)))
[(0, 3), (1, 7), (2, 19)]

E uma solução usando compreensão de lista:

>>> a = [3,7,19]
>>> [(x, a[x]) for x in range(len(a))]
[(0, 3), (1, 7), (2, 19)]
Lucas Ribeiro
fonte
5

enumeratefunção python será atendido seus requisitos

result = list(enumerate([1,3,7,12]))
print result

resultado

[(0, 1), (1, 3), (2, 7),(3,12)]
Harun ERGUL
fonte
2

Se você tiver várias listas, poderá fazer isso combinando enumeratee zip:

list1 = [1, 2, 3, 4, 5]
list2 = [10, 20, 30, 40, 50]
list3 = [100, 200, 300, 400, 500]
for i, (l1, l2, l3) in enumerate(zip(list1, list2, list3)):
    print(i, l1, l2, l3)
Resultado:
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500

Observe que parênteses são necessários depois i. Caso contrário, você receberá o erro:ValueError: need more than 2 values to unpack

Sнаđошƒаӽ
fonte