Как мне перечислить() список кортежей в Python?

У меня есть такой код:

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)

Однако я не могу понять, как их объединить: как использовать перечисление, когда рассматриваемый список состоит из кортежей? Должен ли я это сделать?

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

Или есть более элегантный способ?


person mike    schedule 11.05.2009    source источник
comment
enumerate vs itertools: что следует учитывать при выборе между ними?   -  person spazm    schedule 20.03.2013


Ответы (3)


Это аккуратный способ сделать это:

letters = [('a', 'A'), ('b', 'B')]
for i, (lowercase, uppercase) in enumerate(letters):
    print "Letter #%d is %s/%s" % (i, lowercase, uppercase)
person RichieHindle    schedule 11.05.2009
comment
Как это называется? Я хочу узнать больше об этом синтаксисе. - person Zak; 07.01.2017
comment
@Zak: Если вы имеете в виду назначение (lowercase, uppercase), это называется распаковкой. - person RichieHindle; 07.01.2017
comment
Аккуратный. Я не знал, что синтаксис распаковки может быть вложенным. - person David Foerster; 06.05.2021

Вот как бы я это сделал:

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
person Algorias    schedule 11.05.2009

Вы тоже можете сделать так:

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