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

时间:2020-12-30 16:38:33

标签: 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

这就像“数据”中的 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

打印出所有信息但不保留订单,正如我所愿。

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

3 个答案:

答案 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 中,mapziprangefilter、{{ 1}}、keysvalues 所有返回的列表。在 Python 3 中,它们返回迭代器。

如果您习惯了 Python 2,一开始这可能会让人感到困惑。

相关问题