Python 遍历列表

1 投票
2 回答
9672 浏览
提问于 2025-04-16 19:49

我想要遍历列表中的每一个项目。但是迭代器没有遍历所有的对象。这里是我的函数代码(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

这是我的日志文件的一部分

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

提前感谢任何帮助

2 个回答

9

在遍历列表的时候,不要直接修改它。相反,应该创建一个新的列表,只包含你想保留的那些项目。

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

这是一个简单又高效的做法,读起来也很清晰。

4

很简单:你在遍历 dirs 的时候把当前的项目给删掉了。这就意味着在下一次循环时,你会跳过一个项目。你可以在 这里看到更多信息。

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

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

这就是列表最开始的状态;然后你把 1 删掉了,循环就会跳到列表中的第二个项目:

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

因为你删掉了 1,并且在列表中向前移动了一次,现在你看到的是 3,而不是 2

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

接着你又删掉了 3……依此类推。

撰写回答