Tuple desempaquetado en bucles

Me tropecé con el siguiente código:

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 que el ‘i, un’ bit y buscar en google para obtener información sobre ‘para’ es un problema en el vago y cuando bash y experimento con el código me sale el error:

ValueError: necesita más de 1 valor para descomprimir

¿Alguien sabe lo que hace o algo que ver con eso que puedo buscar en Google para obtener más información?

Usted podría google en “desempaquetar tuple”. Esto se puede utilizar en varios lugares en Python. Lo 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 del iterable es una tupla, entonces puede especificar dos variables y cada elemento del bucle se desempaquetará a los 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 enumeración crea una iterable de tuplas, por lo que puede utilizarse de esta manera.

Enumerate básicamente le da un índice para trabajar en el bucle for. Asi que:

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

Imprimiría

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

Toma este código como ejemplo:

 elements = ['a', 'b', 'c', 'd', 'e'] index = 0 for element in elements: print element, index index += 1 

Usted recorre la lista y también almacena una variable de índice. 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 

El index, element notación del index, element es necesaria porque la enumerate devuelve una tupla ( (1, 'a') , (2, 'b') , …) que se desempaqueta en dos variables diferentes.

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

Resultado:

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

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

Respuesta corta, desempaquetar tuplas de una lista en un bucle for funciona. enumerate () crea una tupla utilizando el índice actual y todo el elemento actual, como por ejemplo (0, (‘bob’, 3))

He creado un código de prueba para demostrar esto:

  list = [('bob', 3), ('alice', 0), ('john', 5), ('chris', 4), ('alex', 2)] print("Displaying Enumerated List") for name, num in enumerate(list): print("{0}: {1}".format(name, num)) print("Display Normal Iteration though List") for name, num in list: print("{0}: {1}".format(name, num)) 

La simplicidad de desempacar Tuple es probablemente una de mis cosas favoritas de Python: D