Вопрос по python – Распаковка кортежей для петель

42

Я наткнулся на следующий код:

for i,a in enumerate(attributes):
   labels.append(Label(root, text = a, justify = LEFT).grid(sticky = W))
   e = Entry(root)
   e.grid(column=1, row=i)
   entries.append(e)
   entries[i].insert(INSERT,"text to insert")

Я не понимаю "я, я" немного и поиск в Google для получения информации о & quot; для & apos; это боль в заднице, и когда я пытаюсь и экспериментирую с кодом, я получаю сообщение об ошибке:

ValueError: need more than 1 value to unpack

Кто-нибудь знает, что он делает или что-то с этим делать, что я могу Google, чтобы узнать больше?

Ваш Ответ

6   ответов
3
[i for i in enumerate(['a','b','c'])]

Результат:

[(0, 'a'), (1, 'b'), (2, 'c')]
Здравствуйте, есть ли название для этой функции, которую вы сделали здесь? Google не кажется плодотворным.[i for i in enumerate(['a','b','c'])]
0

Короткий ответ, распаковка кортежей из списка в цикле for работает. enumerate () создает кортеж с использованием текущего индекса и всего текущего элемента, например (0, («bob», 3))

Я создал тестовый код, чтобы продемонстрировать это:

    list = [('bob', 3), ('alice', 0), ('john', 5), ('chris', 4), ('alex', 2)]

    print("Displaying Enumerated List")
    for name, num in enumerate(list):
        print("{0}: {1}".format(name, num))

    print("Display Normal Iteration though List")
    for name, num in list:
        print("{0}: {1}".format(name, num))

Простота распаковки Tuple, наверное, одна из моих любимых вещей в Python: D

1

enumerate функция возвращает объект генератора, который на каждой итерации выдает кортеж, содержащий индекс элемента (i), пронумерованные начиная с0 по умолчанию в сочетании с самим элементом (a) иfor Цикл удобно позволяет вам получить доступ к обоим полям этих сгенерированных кортежей и присвоить им имена переменных.

74

Вы можете зайти на "распаковку кортежей". Это может быть использовано в разных местах в Python. Самое простое в назначении

>>> x = (1,2)
>>> a, b = x
>>> a
1
>>> b
2

В цикле for это работает аналогично. Если каждый элемент итерируемого является кортежем, вы можете указать две переменные, и каждый элемент в цикле будет распакован в две.

>>> x = [(1,2), (3,4), (5,6)]
>>> for item in x:
...     print "A tuple", item
A tuple (1, 2)
A tuple (3, 4)
A tuple (5, 6)
>>> for a, b in x:
...     print "First", a, "then", b
First 1 then 2
First 3 then 4
First 5 then 6

Функция enumerate создает итеративный набор кортежей, поэтому ее можно использовать таким образом.

13

Перечисление в основном дает вам индекс для работы в цикле for. Так:

for i,a in enumerate([4, 5, 6, 7]):
    print i, ": ", a

Будет печатать:

0: 4
1: 5
2: 6
3: 7
5

Возьмите этот код в качестве примера:

elements = ['a', 'b', 'c', 'd', 'e']
index = 0

for element in elements:
  print element, index
  index += 1

Вы перебираете список и сохраняете также индексную переменную.enumerate() делает то же самое, но более кратко:

elements = ['a', 'b', 'c', 'd', 'e']

for index, element in enumerate(elements):
  print element, index

index, element запись обязательна, потому чтоenumerate возвращает кортеж ((1, 'a'), (2, 'b')...), который распаковывается в две разные переменные.

Похожие вопросы