¿Cómo se desempaquetan las tuplas en bucles for?

3 minutos de lectura

avatar de usuario
talisina

Me topé 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 el i, a bit, y buscando información sobre for no produjo ningún resultado útil. Cuando intento y experimento con el código me sale el error:

ValueError: necesita más de 1 valor para desempaquetar

¿Alguien sabe lo que hace, o un término más específico asociado con él que pueda buscar en Google para obtener más información?

avatar de usuario
BrenBarn

podrías googlear “desempaquetado de tuplas”. 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 del iterable es un tupleluego puede especificar dos variables, y cada elemento en el 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

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

  • Gracias, esto es justo lo que estaba buscando. Ya sabía cómo usar enumerate pero no era consciente de la for idx, (name, addr, pet) método de desempaquetado de tuplas. ¡Salud!

    – melón

    7 junio 2021 a las 21:28

avatar de usuario
que

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

Resultado:

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

  • Hola, ¿Hay un nombre para esta característica que hiciste aquí? Google no parece ser fructífero. [i for i in enumerate(['a','b','c'])]

    – Zaid Kan

    7 de diciembre de 2018 a las 14:06

  • Esto se llama un lista de comprensión

    – jlhasson

    25 de septiembre de 2019 a las 22:16

avatar de usuario
lorkaan

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

Creé 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 del desempaquetado de Tuple es probablemente una de mis cosas favoritas de Python 😀

  • Hola, ¿Hay un nombre para esta característica que hiciste aquí? Google no parece ser fructífero. [i for i in enumerate(['a','b','c'])]

    – Zaid Kan

    7 de diciembre de 2018 a las 14:06

  • Esto se llama un lista de comprensión

    – jlhasson

    25 de septiembre de 2019 a las 22:16

avatar de usuario
greg e.

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad