13

试图枚举某个目录中的所有文件(如 Linux 中的“find .”或 Windows 中的“dir /s /b”)。

我想出了以下嵌套列表理解:

from os import walk
from os.path import join
root = r'c:\windows'      #choose any folder here
allfiles = [join(root,f) for f in files for root,dirs,files in walk(root)]

不幸的是,对于最后一个表达式,我得到:

NameError: name 'files' is not defined

这个问题相关,这(虽然有效)我无法理解嵌套列表理解的语法。

4

2 回答 2

27

您需要反转嵌套;

allfiles = [join(root,f) for root,dirs,files in walk(root) for f in files]

请参阅列表理解文档

提供列表推导时,它由一个表达式组成,后跟至少一个for子句和零个或多个fororif子句。在这种情况下,新列表的元素是通过将每个fororif子句视为一个块、从左到右嵌套并在每次到达最里面的块时计算表达式以产生一个列表元素而产生的元素。

换句话说,因为您基本上想要以下道德等价物:

allfiles = []
for root, dirs, files in walk(root):
    for f in files:
        allfiles.append(f)

您的列表理解应该遵循相同的顺序。

于 2012-10-24T14:55:23.567 回答
5

这是:

allfiles = [join(root, f) for _, dirs, files in walk(root) for f in files]
于 2012-10-24T14:55:19.633 回答