在for循环中解包列表的列表时遇到问题?
我有一个包含多个列表的列表,我想在循环中把它们拆开,但遇到了一些问题。
>>> 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'])
,你把它拆开成 a
和 b
。因为 a
和 b
的数量和 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
中的第一个元素拆开,赋值给 a
和 b
,然后再循环处理 set
中的下一个元素,依此类推,像这样 a,b = set[0] ... 循环 ... a,b = set[1] ... 循环 ...
所以,Python 在尝试把 set
中的第一个元素拆分成 a
和 b
时,发现这样做是行不通的。