【问题标题】:Nested for loop in 'lists' and 'iterators'嵌套在“列表”和“迭代器”中的 for 循环
【发布时间】:2020-06-28 07:18:21
【问题描述】:

我有这两个列表

l1 = [1,2,3]
l2 = [10,20,30]

我使用这个嵌套的 for 循环来访问所有可能的对:

for a in l1:
    for b in l2:
        print(a,b)

我得到以下预期结果:

1 10
1 20
1 30
2 10
2 20
2 30
3 10
3 20
3 30

但如果我将 l1 和 l2 转换为迭代器,我会得到不同的结果,并且我无法访问所有对:

l1=iter(l1)
l2=iter(l2)

for a in l1:
    for b in l2:
        print(a,b)

1 10
1 20
1 30

我无法理解这两个代码 sn-ps 之间的区别。为什么迭代器会产生这个结果?

【问题讨论】:

  • 一旦你使用了迭代器,它就完成了。没有更多的价值给你。在第一个for b in l2: 之后,井是干的。
  • 我知道这不像 看起来 重复,但这是我可以轻松找到的最接近的匹配这个常见问题。 iter 创建的序列迭代器与open 创建的文件迭代器具有相同的相关行为。
  • @KarlKnechtel -实际上...文件可以倒带(例如,file.seek(0))。他们是一个反例。 iter() 本身并不关心你得到哪种类型的迭代器。 list_iterator不能倒带,文件可以。
  • 他们可以,但重点在于具体的迭代风格。
  • @KarlKnechtel- 是的,这是因为阅读器对象是迭代器,就像 open() 返回的文件对象一样。

标签: python list iterator nested-loops


【解决方案1】:
l2=iter(l2)

这会从l2 创建一个迭代器。一个迭代器只能迭代一次。之后,interator就完成了。如果您想再次迭代 l2,则需要从中创建另一个迭代器。

for a in l1:
    for b in l2:
        print(a,b)

这将尝试迭代l2 - 对l1 中的每个项目进行一次。如果l1 中有超过 1 个项目,则将不起作用 - 因为 l2 迭代器在第一次迭代后已经耗尽。

所以你需要这样的东西:

l1 = iter(l1)

for a in l1:
    l2_iter = iter(l2)
    for b in l2_iter:
        print(a,b)

这会如你所愿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    相关资源
    最近更新 更多