我有一段这样的代码:
items1 = ['col1', 'col2']
items2 = ['a', 'b']
items3 = [1, 2]
data = zip(items2, items3)
for col in items1:
print(col)
for d in data:
print(d)
输出为:
col1
('a', 1)
('b', 2)
col2
这就像“数据”中的 for 循环只工作一次。 我的预期输出是一些:
col1
('a', 1)
('b', 2)
col2
('a', 1)
('b', 2)
如果我反转嵌套结构中的循环,它会起作用,例如:
for d in data:
print(d)
for col in items1:
print(col)
其输出是:
('a', 1)
col1
col2
('b', 2)
col1
col2
打印出所有信息但不保留订单,正如我所愿。
预先感谢您的任何建议,如果问题的格式不符合网站规则,我很抱歉(这是我在这里的第一个问题)。
答案 0 :(得分:4)
大多数(如果不是全部)迭代器只能被遍历一次。这看起来令人困惑的原因是您习惯于迭代列表,但列表不是迭代器。它们是可迭代的,因为您可以获得列表的迭代器。 for
循环隐式调用列表上的 iter
,但您也可以显式调用。
itr = iter([1,2,3]) # itr is a value of type list_iterator
# Fully consumes itr, outputting
#
# 1
# 2
# 3
for x in itr:
print(x)
# Produces no output, because there is nothing left in itr to iterate over
for x in itr:
print(x)
如果你想多次迭代结果,你要么每次都需要调用zip
,
for col in items1:
print(col)
data = zip(items2, items3)
for d in data:
print(d)
或者先从 zip
对象创建一个列表。
data = list(zip(items2, items3))
for col in items1:
print(col)
for d in data:
print(d)
答案 1 :(得分:3)
zip 产生一个迭代器。你用一次它就没有了。相反,您可以将其存储到一个容器(例如列表)中,这样您就可以根据需要对其进行多次迭代。
items1 = ['col1', 'col2']
items2 = ['a', 'b']
items3 = [1, 2]
data = list(zip(items2, items3))
for col in items1:
print(col)
for d in data:
print(d)
答案 2 :(得分:0)
值得注意的是,这是 Python 2 和 Python 3 之间的重大变化之一。在 Python 2 中,map
、zip
、range
、filter
、{{ 1}}、keys
、values
所有返回的列表。在 Python 3 中,它们返回迭代器。
如果您习惯了 Python 2,一开始这可能会让人感到困惑。