2009-05-11 7 views
32

Mam trochę kodu:Jak wyliczyć() na liście krotek w Pythonie?

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

Powiedziano mi, że istnieje funkcja enumerate(), która może zająć się "i" zmienna dla mnie:

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

Jednak nie mogę wymyślić, jak połączyć te dwa: Jak używać wyliczyć, gdy lista jest złożona z krotek? Czy muszę to zrobić?

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

A może jest bardziej elegancki sposób?

+0

enumerate vs itertools: co należy wziąć pod uwagę przy wyborze między nimi? – spazm

Odpowiedz

76

Jest to świetny sposób, aby to zrobić:

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

Co to się nazywa? Chcę dowiedzieć się więcej o tej składni. – Zak

+1

@Zak: Jeśli chodzi o przypisywanie do '(małe litery, wielkie litery)', nazywa się to "rozpakowywaniem". – RichieHindle

3

To jak bym to zrobić:

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: rozpakowywanie staje się zbędny. To jest bardziej zwarty sposób, który może działać lub nie w zależności od przypadku użycia:

import itertools 

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

Można to zrobić w ten sposób TOO:

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