How do I enumerate() over a list of tuples in Python?
Question:
I’ve got some code like this:
letters = [('a', 'A'), ('b', 'B')]
i = 0
for (lowercase, uppercase) in letters:
print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
i += 1
I’ve been told that there’s an enumerate() function that can take care of the “i” variable for me:
for i, l in enumerate(['a', 'b', 'c']):
print "%d: %s" % (i, l)
However, I can’t figure out how to combine the two: How do I use enumerate when the list in question is made of tuples? Do i have to do this?
letters = [('a', 'A'), ('b', 'B')]
for i, tuple in enumerate(letters):
(lowercase, uppercase) = tuple
print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
Or is there a more elegant way?
Answers:
This is a neat way to do it:
letters = [('a', 'A'), ('b', 'B')]
for i, (lowercase, uppercase) in enumerate(letters):
print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
This is how I’d do it:
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: unpacking becomes redundant. This is a more compact way, which might work or not depending on your use case:
import itertools
letters = [('a', 'A'), ('b', 'B')]
for i in zip(itertools.count(),*zip(*letters)):
print "Letter #%d is %s/%s" % i
You can do this way too:
letters = [('a', 'A'), ('b', 'B')]
for i, letter in enumerate(letters):
print "Letter #%d is %s/%s" % (i, letter[0], letter[1])
You could also write a generator:
def enumerate_nested(nested_collection, start=0):
for index, row in enumerate(nested_collection, start):
yield index, *row
Which then allows you to iterate over the collection of tuple (or list) and to unpack the values:
names = [["Heinz", "Steiner"], ["Fred", "Glauser"], ["Nicole", "Hauser"]]
for index, first_name, last_name in enumerate_nested(names, 1):
print(index, first_name, last_name)
However, there is a simpler built-in solution to achieve this. Have a look at Richie Hindle’s answer:
names = [["Heinz", "Steiner"], ["Fred", "Glauser"], ["Nicole", "Hauser"]]
for index, (first_name, last_name) in enumerate(names, 1):
print(index, first_name, last_name)
I’ve got some code like this:
letters = [('a', 'A'), ('b', 'B')]
i = 0
for (lowercase, uppercase) in letters:
print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
i += 1
I’ve been told that there’s an enumerate() function that can take care of the “i” variable for me:
for i, l in enumerate(['a', 'b', 'c']):
print "%d: %s" % (i, l)
However, I can’t figure out how to combine the two: How do I use enumerate when the list in question is made of tuples? Do i have to do this?
letters = [('a', 'A'), ('b', 'B')]
for i, tuple in enumerate(letters):
(lowercase, uppercase) = tuple
print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
Or is there a more elegant way?
This is a neat way to do it:
letters = [('a', 'A'), ('b', 'B')]
for i, (lowercase, uppercase) in enumerate(letters):
print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
This is how I’d do it:
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: unpacking becomes redundant. This is a more compact way, which might work or not depending on your use case:
import itertools
letters = [('a', 'A'), ('b', 'B')]
for i in zip(itertools.count(),*zip(*letters)):
print "Letter #%d is %s/%s" % i
You can do this way too:
letters = [('a', 'A'), ('b', 'B')]
for i, letter in enumerate(letters):
print "Letter #%d is %s/%s" % (i, letter[0], letter[1])
You could also write a generator:
def enumerate_nested(nested_collection, start=0):
for index, row in enumerate(nested_collection, start):
yield index, *row
Which then allows you to iterate over the collection of tuple (or list) and to unpack the values:
names = [["Heinz", "Steiner"], ["Fred", "Glauser"], ["Nicole", "Hauser"]]
for index, first_name, last_name in enumerate_nested(names, 1):
print(index, first_name, last_name)
However, there is a simpler built-in solution to achieve this. Have a look at Richie Hindle’s answer:
names = [["Heinz", "Steiner"], ["Fred", "Glauser"], ["Nicole", "Hauser"]]
for index, (first_name, last_name) in enumerate(names, 1):
print(index, first_name, last_name)