2009-05-11 32 views
32

Tengo algo de código como este:¿Cómo enumero() sobre una lista de tuplas en Python?

letters = [('a', 'A'), ('b', 'B')] 
i = 0 
for (lowercase, uppercase) in letters: 
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase) 
    i += 1 

Me han dicho que hay una función enumerate() que puede hacerse cargo de la variable "i" para mí:

for i, l in enumerate(['a', 'b', 'c']): 
    print "%d: %s" % (i, l) 

Sin embargo, no puedo entender cómo combinar los dos: ¿cómo uso enumerate cuando la lista en cuestión está hecha de tuplas? ¿Tengo que hacer esto?

letters = [('a', 'A'), ('b', 'B')] 
for i, tuple in enumerate(letters): 
    (lowercase, uppercase) = tuple 
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase) 

O hay una forma más elegante?

+0

enumerar vs itertools: ¿qué debemos tener en cuenta a la hora de elegir ¿entre ellos? – spazm

Respuesta

76

Ésta es una clara forma de hacerlo:

letters = [('a', 'A'), ('b', 'B')] 
for i, (lowercase, uppercase) in enumerate(letters): 
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase) 
+1

¿Cómo se llama esto? Quiero buscar más sobre esta sintaxis. – Zak

+1

@Zak: si se refiere a asignar a '(minúscula, mayúscula)', se llama "desembalaje". – RichieHindle

3

Ésta es la forma en que lo haría:

import itertools 

letters = [('a', 'A'), ('b', 'B')] 
for i, lower, upper in zip(itertools.count(),*zip(*letters)): 
    print "Letter #%d is %s/%s" % (i, lower, upper) 

EDIT: desembalaje se vuelve redundante. Esta es una forma más compacta, lo que podría funcionar o no dependiendo de su caso de uso:

import itertools 

letters = [('a', 'A'), ('b', 'B')] 
for i in zip(itertools.count(),*zip(*letters)): 
    print "Letter #%d is %s/%s" % i 
0

Puede hacerlo de esta manera también:

letters = [('a', 'A'), ('b', 'B')] 
for i, letter in enumerate(letters): 
    print "Letter #%d is %s/%s" % (i, letter[0], letter[1]) 
Cuestiones relacionadas