【问题标题】:How to loop twice over a list in Python如何在Python中的列表上循环两次
【发布时间】:2017-12-01 04:06:00
【问题描述】:

我有一个包含 CSV 内容的字符串。我把它变成了这样的列表:

from StringIO import StringIO
import csv

f = StringIO(list_csv)
my_list = csv.reader(f, delimiter=',')

现在我想在列表上循环两次,但第二次尝试循环时,代码会像列表为空一样遍历:

for item in my_list:
    code = item[1]
    print "code: "+code

for item in my_list:
    desc = item[2]
    print "desc: "+desc

(此代码出于演示目的进行了简化,我无法在单个循环中组合执行)

我认为列表仍然附加到 StringIO,当它完成循环时,它已经完成读取,所以它不会再次读取。是否有一种方法可以将其转换为内存中的常规列表,我可以循环多次?我觉得手动运行循环复制值是在重新发明轮子......但如果没有其他选择,我可以这样做。只是要求一些不那么冗长的代码。谢谢!

【问题讨论】:

  • my_list 是一个读取器对象,将其转换为列表,可能像这样new_list = list(my_list) 并循环遍历new_list
  • 谢谢。您应该发布作为答案。 ;) 是的....这就是我现在在 python 的新手。 :$

标签: python list for-loop


【解决方案1】:

问题在于my_list 实际上并不是一个列表。它是一个iterator(在这种特殊情况下实际上是一个reader object,它只是一种迭代器)。

在第一次产生所有值后使用迭代器。这就是mylist 发生的情况:在您第一次循环之后,读取器对象已经被消耗,无法再次迭代。

一种解决方案是将内容存储在实际的list 对象中。这应该可以解决它:

my_list = list(csv.reader(f, delimiter=','))

...然后像以前一样继续。

顺便说一下,如果您使用的是最新版本的 Python 3,有一种非常好的语法可用于将迭代器解包到列表中:

my_list = [*csv.reader(f, delimiter=',')]

【讨论】:

    【解决方案2】:

    使用以下代码:

    my_list = list(csv.reader(f, delimiter=','))
    

    【讨论】:

      【解决方案3】:

      在 itertools 中使用 tee 函数,它可以为您提供对迭代器的更多访问,而不仅仅是一次。

      from itertools import tee
      
      i1, i2 = tee(my_list)
      
      for i in i1:
          pass
      
      for i in i2:
          pass
      

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 2018-12-10
        • 2021-02-25
        • 1970-01-01
        • 2022-09-24
        • 2018-10-28
        • 1970-01-01
        • 2023-04-06
        • 2015-04-22
        相关资源
        最近更新 更多