Python中带有zip()函数的嵌套for循环存在问题

Python中带有zip()函数的嵌套for循环存在问题,python,loops,Python,Loops,我有一段代码如下: 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 ('a', 1) col1 col2 ('b', 2) col1 col2 这就像“数

我有一段代码如下:

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
('a', 1)
col1
col2
('b', 2)
col1
col2
这就像“数据”中的for循环只工作一次。 我的预期产出是:

col1
('a', 1)
('b', 2)
col2
('a', 1)
('b', 2)
如果我反转嵌套结构中的循环,它会起作用,如:

for d in data:
    print(d)
    for col in items1:
        print(col)
其输出为:

col1
('a', 1)
('b', 2)
col2
('a', 1)
col1
col2
('b', 2)
col1
col2
打印出所有的信息,但不保留秩序,因为我想


提前感谢您的建议,如果问题的格式不符合网站规则,我很抱歉。这是我在这里的第一个问题。

大多数(如果不是所有)迭代器只能遍历一次。这看起来令人困惑的原因是您习惯于对列表进行迭代,但列表不是迭代器。它们是可编辑的,因为您可以获得列表的迭代器。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)

大多数迭代器(如果不是所有迭代器的话)只能遍历一次。这看起来令人困惑的原因是您习惯于对列表进行迭代,但列表不是迭代器。它们是可编辑的,因为您可以获得列表的迭代器。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)

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)

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)

值得注意的是,这是Python2和Python3之间的重大变化之一。在Python2中,map、zip、range、filter、key、value、items都返回了列表。在Python3中,它们返回迭代器


如果您习惯于使用Python 2,一开始可能会感到困惑。

值得注意的是,这是Python 2和Python 3之间的一个重大变化。在Python2中,map、zip、range、filter、key、value、items都返回了列表。在Python3中,它们返回迭代器


如果您习惯使用Python 2,一开始可能会感到困惑。

您可能正在查找data=listzipitems2,items3 zip是一个迭代器,一旦用完就会耗尽,它不可重用。这就是为什么您需要调用zip的原因,您可能正在寻找data=listzipitems2,items3压缩包是一个迭代器,一旦用完就会耗尽,它是不可重用的。这就是为什么在需要时调用压缩包,而不是试图提前保存返回值的原因。