2011-06-18 86 views
1

我尝试迭代列表中的每个项目。但迭代器不会遍历所有对象。 这里是我的功能码(显示目录和根来自os.walk)python迭代列表

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 
... 

预先感谢任何帮助

回答

4

非常很简单:您在迭代时从dirs中删除当前项目。这意味着你在下一个循环中跳过两个前进。见here

如果我说不清楚,说你遍历号码名单:

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

这就是最初名单的状态;然后1被删除,循环进入第二个项目在列表中:

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

既然你已经删除1在列表中向前移动一个,现在你在3,不2

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

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

+1

快速解决方法是通过对其进行分片来复制列表:for d in dirs [:] –

+0

更重要的是:这意味着循环会跳过某些条目,因为它们都已经移动了一个位置。 – Robin

+0

@Robin,就是我说的。不是吗? – senderle

9

不要在迭代它们时修改列表。取而代之的是,只用你想保留的物品产生一个新的清单。

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

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