【问题标题】:python iterating over listpython遍历列表
【发布时间】:2011-06-18 14:53:29
【问题描述】:

我尝试遍历列表中的每个项目。但是迭代器不会遍历所有对象。 这是我的函数代码(dirs和root来自os.walk)

def remove_hidden_dirs(dirs,root):
    """
    Function remove hidden directories . .. in unix
    """
    logging.debug("\n\n remove hidden" )
    logging.debug('Start removing hidden dirs for %s',root)
    logging.debug("Length of dirs %s",len(dirs))
    logging.debug('File list before removing')
    dirs.sort()
    for d in dirs:
        logging.debug(d)
    i=0
    for d in dirs:
        i=i+1
        logging.debug("Iterating over %s",d)
        if d[0:1] == '.' or d[0:2] =='..':
            dirs.remove(d)
            logging.debug("Dir %s is being removed because of being hidden dir",d)
        else:
            logging.debug("Dir %s is NOT being removed because of being hidden dir",d)
    logging.debug("Iterate on %s", i)
    logging.debug('File list after removing')
    for d in dirs:
        logging.debug(d)
    logging.debug('end remove hidden files\n\n')
    return dirs

这是我的 log.file 的一部分

DEBUG:root:Start removing hidden dirs for /home/artur/
DEBUG:root:Length of dirs 38
DEBUG:root:File list before removing
DEBUG:root:.adobe
DEBUG:root:.android
DEBUG:root:.cache
DEBUG:root:.config
DEBUG:root:.dbus
...
DEBUG:root:Iterate on 22 dirs
DEBUG:root:File list after removing
DEBUG:root:.adobe
DEBUG:root:.cache
DEBUG:root:.dbus
...

提前感谢您的帮助

【问题讨论】:

    标签: python list iteration


    【解决方案1】:

    在迭代列表时不要修改列表。相反,生成一个仅包含您想要保留的项目的新列表。

    dirs = [d for d in dirs if not d.startswith('.')]
    

    是一种有效的简单易读的技术。

    【讨论】:

      【解决方案2】:

      非常简单:您正在从dirs 中删除当前项目,同时对其进行迭代。这意味着您在下一个循环中向前跳过两个。见here

      如果我说的不是很清楚,假设你遍历这个数字列表:

      [1, 2, 3, 4, 5, 6...]
       ^
      

      这是列表最初的状态;然后1 被删除,循环转到列表中的第二项:

      [2, 3, 4, 5, 6...]
          ^
      

      由于您已删除1 在列表中向前移动了一位,现在您位于3,而不是2

      [2, 4, 5, 6...]
      

      然后你删除3...等等。

      【讨论】:

      • 快速解决方法是通过切片来复制列表:for d in dirs[:]
      • 更重要的是:这意味着循环会跳过某些条目,因为它们都移动了一个位置。
      • @Robin,我就是这么说的。不是吗?
      • @senderle,当我发表评论时,答案并没有这么说,但现在确实如此。
      • @Robin,我会澄清一下:这就是我说“这意味着你在下一个循环中向前跳过两个”时的意思,这在第一个版本中我的帖子。
      猜你喜欢
      • 2013-02-18
      • 2018-03-08
      • 2015-10-07
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多