базовый запрос python относительно распаковки всех значений в пронумерованном списке кортежей в python

Мне было просто любопытно, и я подумал, что это логически должно работать на питоне. Я попробовал следующий код в консоли Python:

mylist = [('a','b'),('c','d')]

for i,x,y in enumerate(mylist):
    print i,x,y

ValueError: need more than 2 values to unpack

Но если я попытаюсь не перечислять, а просто сделаю следующее:

mylist = [('a','b'),('c','d')]

    for i,x in mylist:
        print i,x

это работает нормально. Мне просто интересно, почему первый метод не работает, поскольку это не должно мешать распаковке значений Python из кортежей, не так ли? Если только я не упустил из виду что-то смущающе простое. Очень хотелось бы узнать причину такого странного поведения.

Как генерировать перечисляемые кортежи из словарь со списком в Python?

говорит, что значение функции enumerate() представляет собой кортеж из двух элементов. Но в моем случае второй элемент кортежа, возвращаемый enumerate, сам будет кортежем, так почему его нельзя распаковать?


person anonuser0428    schedule 10.01.2014    source источник
comment
Может помочь: stackoverflow.com/questions/849369/   -  person alecxe    schedule 10.01.2014
comment
Также может помочь просто выполнить for z in enumerate(mylist): print(z) и посмотреть, что получится.   -  person abarnert    schedule 10.01.2014
comment
я понимаю, что в первом случае это кортеж индекса и еще один кортеж, но я просто чувствовал, что во втором случае, без enumerate, он сам распаковывает кортеж. В первом случае с перечислением он рекурсивно распаковал бы кортеж внутри кортежа перечисления. Ничего страшного, просто любопытно было такое поведение. Спасибо за все ваши ответы.   -  person anonuser0428    schedule 10.01.2014


Ответы (3)


каждая запись из enumerate возвращает ровно 2 значения; первый - перечисление; второй является следующим в списке ввода.

Я думаю, что вы имеете в виду следующее:

for i,(x,y) in enumerate(mylist):
    print i,x,y
person AMADANON Inc.    schedule 10.01.2014

Первый метод не работает, потому что они не так упакованы.

for i, (x, y) in enumerate(mylist):
    print i, x, y
person Ignacio Vazquez-Abrams    schedule 10.01.2014

Когда вы перебираете mylist, каждое значение представляет собой элемент: кортеж из двух строк.

Когда вы перебираете enumerate(mylist), каждое значение является кортежем из индекса и элемента, который сам является кортежем из двух строк. Итак, вы эффективно делаете это:

i, x, y = (0, ('a', 'b'))

Это не сработает. Но это будет:

i, (x, y) = (0, ('a', 'b'))

И поэтому, что вы хотите:

for i, (x, y) in enumerate(mylist):
person abarnert    schedule 10.01.2014