在for循环中解包列表的列表时遇到问题?

2 投票
3 回答
7709 浏览
提问于 2025-04-16 00:50

我有一个包含多个列表的列表,我想在循环中把它们拆开,但遇到了一些问题。

>>> 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

为什么第一个能正常工作,而第二个却不行呢?

3 个回答

2

主要是因为它们完全不同:

在第一个循环中,set(date(2010, 7, 5), ['item 1', 'item 2']),你把它拆开成 ab。因为 ab 的数量和 set 一样,所以这样做是没问题的。

在第二个循环中,你是遍历 set(这是一个包含两个元素的元组,所以你可以遍历它),然后试着拆开第一个元素:循环的第一次迭代中,tmp = set[0] 取得的是 date(2010, 7, 5),接着你试着用 a,b = tmp 拆开它,但这样会出错,出现了你看到的错误信息。

3

我觉得你想要的东西大概是这样的:

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


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

另外,注意一下,set这个名字不太好用作变量名,因为它会和内置的名称冲突。

1

for a,b in set 这个写法可以理解为:先把 set 中的第一个元素拆开,赋值给 ab,然后再循环处理 set 中的下一个元素,依此类推,像这样 a,b = set[0] ... 循环 ... a,b = set[1] ... 循环 ...

所以,Python 在尝试把 set 中的第一个元素拆分成 ab 时,发现这样做是行不通的。

撰写回答