如何在Python中对元组列表进行enumerate()枚举?

58

我有这样的一段代码:

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

我被告知有一个enumerate()函数可以为我处理"I"变量:

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

然而,我不知道如何将这两个操作结合起来:当涉及到由元组组成的列表时,如何使用enumerate?我必须这样做吗?

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

还有更优雅的方法吗?


枚举 vs itertools:在选择它们之间应该考虑什么? - spazm
4个回答

140

这是一个简洁的方法:

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

2
这叫什么?我想查找更多关于这个语法的信息。 - Zak
7
如果你的意思是将值赋给(小写字母, 大写字母),那么这被称为“拆包”(unpacking)。 - RichieHindle
1
不错。我不知道解包语法可以嵌套。 - David Foerster
太棒了!我总是编写一个辅助生成器来实现这个。我不知道嵌套是可能的。偶然发现了这个问题。谢谢! - Thomas

4
这是我会做的方式:
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)

编辑:解包变得多余了。这是一种更紧凑的方式,可能根据您的用例工作或不工作:

import itertools

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

1

你也可以这样做:

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

0

你也可以写一个生成器:

def enumerate_nested(nested_collection, start=0):

    for index, row in enumerate(nested_collection, start):
        yield index, *row

这样就可以遍历元组(或列表)的集合并解包其中的值:

names = [["Heinz", "Steiner"], ["Fred", "Glauser"], ["Nicole", "Hauser"]]

for index, first_name, last_name in enumerate_nested(names, 1):
    print(index, first_name, last_name)

然而,有一个更简单的内置解决方案可以实现这一点。请看{{link1:Richie Hindle的答案}}:

names = [["Heinz", "Steiner"], ["Fred", "Glauser"], ["Nicole", "Hauser"]]

for index, (first_name, last_name) in enumerate(names, 1):
    print(index, first_name, last_name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接