У меня есть список списков, которые я хочу распаковать для циклов, но я столкнулся с проблемой.

>>> a_list = [(date(2010, 7, 5), ['item 1', 'item 2']), (date(2010, 7, 6), ['item 1'])]
>>>
>>> for set in a_list:
...     a, b = set
...     print a, b
...
2010-07-05 ['item 1', 'item 2']
2010-07-06 ['item 1']
>>>
>>> for set in a_list:
...     for a, b in set:
...             print a, b
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: 'datetime.date' object is not iterable

Почему первый работает, а второй нет?

2
mattjn 5 Июл 2010 в 18:10

3 ответа

Лучший ответ

for a,b in set эквивалентен a,b = set[0] ... loop ... a,b = set[1] ... loop ...

Поэтому Python попытался распаковать первый элемент в set в кортеж a,b, который не работает.

1
Aaron Digulla 5 Июл 2010 в 14:13

Я думаю, вы ищете что-то вроде этого:

>>> for a, b in a_list:
    print(a, b)


2010-07-05 ['item 1', 'item 2']
2010-07-06 ['item 1']

Также обратите внимание, что set является недопустимым именем для переменной, поскольку она скрывает встроенную функцию.

1
SilentGhost 5 Июл 2010 в 14:30

Главным образом потому, что они совершенно разные:

В первом цикле set равен (date(2010, 7, 5), ['item 1', 'item 2']), и вы его распаковываете. a,b и set имеют одинаковую длину, поэтому это работает.

Во втором вы перебираете набор (кортеж с 2 элементами, поэтому вы можете зациклить его) и пытаетесь распаковать первый элемент: первая итерация цикла выполняет tmp = set[0], то есть date(2010, 7, 5), затем вы пытаетесь a,b = tmp, что не удается с данным сообщением об ошибке.

2
Jochen Ritzel 5 Июл 2010 в 14:15