2009-05-11 5 views
32

Ich habe einige Code wie folgt bekommen:Wie liste ich() über eine Liste von Tupeln in Python auf?

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

Ich habe gesagt, dass eine Aufzählung gibt es() Funktion, die Pflege der "i" Variable für mich nehmen kann:

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

Ich kann jedoch nicht herausfinden, wie die beiden zu kombinieren sind: Wie verwende ich enumerate, wenn die fragliche Liste aus Tupeln besteht? Muss ich das tun?

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

Oder gibt es einen eleganteren Weg?

+0

enumerate vs itertools: Was sollten wir berücksichtigen bei der Auswahl zwischen ihnen? – spazm

Antwort

76

Dies ist eine nette Art und Weise, es zu tun:

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

Wie heißt das? Ich möchte mehr über diese Syntax nachlesen. – Zak

+1

@Zak: Wenn Sie das Zuweisen von '(Kleinbuchstaben, Großbuchstaben) bedeuten, heißt das" Entpacken ". – RichieHindle

3

Dies ist, wie ich es tun würde:

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: auspacken überflüssig wird. Dies ist ein kompakter Art und Weise, die auf Ihren Anwendungsfall könnte funktionieren oder nicht abhängig:

import itertools 

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

Sie auf diese Weise tun:

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