2012-06-03 23 views
27

yo me encontré con el siguiente código:Tupla desembalaje de los bucles

for i,a in enumerate(attributes): 
    labels.append(Label(root, text = a, justify = LEFT).grid(sticky = W)) 
    e = Entry(root) 
    e.grid(column=1, row=i) 
    entries.append(e) 
    entries[i].insert(INSERT,"text to insert") 

No entiendo la 'i, un' bit y Google la búsqueda de información sobre 'por' es un dolor en el culo y cuando intento y Experement con el código me sale el error:

ValueError: need more than 1 value to unpack

¿alguien sabe lo que hace o algo que ver con eso que puedo google para aprender más?

Respuesta

49

Puedes buscar en google "tuple desempacar". Esto se puede usar en varios lugares en Python. El más simple está en la asignación

>>> x = (1,2) 
>>> a, b = x 
>>> a 
1 
>>> b 
2 

En un bucle for funciona de manera similar. Si cada elemento de la iterable es una tupla, puede especificar dos variables y cada elemento en el bucle se desempaquetará en las dos.

>>> x = [(1,2), (3,4), (5,6)] 
>>> for item in x: 
...  print "A tuple", item 
A tuple (1, 2) 
A tuple (3, 4) 
A tuple (5, 6) 
>>> for a, b in x: 
...  print "First", a, "then", b 
First 1 then 2 
First 3 then 4 
First 5 then 6 

La función de enumerar crea un iterable de tuplas, por lo que se puede usar de esta manera.

1

La función enumerate devuelve un objeto generador que, en cada iteración, se obtiene una tupla que contiene el índice del elemento (i), numeradas a partir de 0 por defecto, junto con el propio elemento (a), y el bucle for convenientemente le permite acceder a ambos campos de esas tuplas generadas y asignarles nombres de variables.

6

Enumerar básicamente le da un índice para trabajar en el ciclo for. Por lo tanto:

for i,a in enumerate([4, 5, 6, 7]): 
    print i, ": ", a 

imprimiría:

0: 4 
1: 5 
2: 6 
3: 7 
4

Tome este código como un ejemplo:

elements = ['a', 'b', 'c', 'd', 'e'] 
index = 0 

for element in elements: 
    print element, index 
    index += 1 

se recorre la lista y almacenar una variable índice también. enumerate() hace lo mismo, pero de manera más concisa:

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

for index, element in enumerate(elements): 
    print element, index 

se requiere La notación index, element PORQUE enumerate devuelve una tupla ((1, 'a'), (2, 'b'), ...) que se desempaquetado en dos variables diferentes.

2
[i for i in enumerate(['a','b','c'])] 

Resultado:

[(0, 'a'), (1, 'b'), (2, 'c')] 
Cuestiones relacionadas