web-dev-qa-db-fra.com

Tuple déballer pour les boucles

Je suis tombé sur le code suivant:

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")

Je ne comprends pas le mot 'un peu' et chercher sur Google des informations sur le mot 'for' est un problème, et lorsque j'essaie d'expérimenter avec le code, j'obtiens l'erreur

ValueError: besoin de plus d'une valeur pour décompresser

Est-ce que quelqu'un sait ce qu'il fait ou quelque chose à voir avec cela que je peux google pour en savoir plus?

42
Talisin

Vous pouvez google sur "Tuple Déconditionnement". Cela peut être utilisé à différents endroits en Python. Le plus simple est en cours

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

Dans une boucle for, cela fonctionne de manière similaire. Si chaque élément de l'itérable est un tuple, vous pouvez alors spécifier deux variables et chaque élément de la boucle sera décompressé en deux.

>>> 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 fonction enumerate crée un itérable de n-uplets, elle peut donc être utilisée de cette façon.

73
BrenBarn

Enumerate vous donne essentiellement un index à utiliser dans la boucle for. Alors:

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

Souhaitez imprimer:

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

Prenons ce code comme exemple:

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

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

Vous parcourez la liste en boucle et stockez également une variable d'index. enumerate() fait la même chose, mais de façon plus concise:

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

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

La notation index, element est requise car enumerate renvoie un tuple ((1, 'a'), (2, 'b'), ...) qui est décompressé en deux variables différentes.

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

Résultat:

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

La fonction enumerate renvoie un objet générateur qui, à chaque itération, donne un tuple contenant l'index de l'élément (i), numéroté à partir de 0 par défaut, associé à l'élément lui-même (a), et la boucle for qui vous permet de: accédez aux deux champs de ces n-uplets générés et affectez-leur des noms de variables.

1
Greg E.

Une réponse courte, décompresser les nuplets d'une liste dans une boucle for fonctionne . Enumerate () crée un nuplet en utilisant l'index courant et l'intégralité de l'élément courant, tel que (0, ('bob', 3))

J'ai créé un code de test pour illustrer ceci:

    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 simplicité de décompression de Tuple est probablement l'une de mes choses préférées à propos de Python: D

0
lorkaan