Uri*_*Uri 8 python list-comprehension
试图枚举某个目录中的所有文件(如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)]
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于最后一个表达式,我得到:
NameError: name 'files' is not defined
与此问题相关,哪个(虽然有效)我无法理解嵌套列表理解的语法.
Mar*_*ers 18
你需要反转嵌套;
allfiles = [join(root,f) for root,dirs,files in walk(root) for f in files]
Run Code Online (Sandbox Code Playgroud)
请参阅列表理解文档:
当提供列表推导时,它由一个表达式后跟至少一个
for子句和零个或多个for或if子句组成.在这种情况下,新列表的元素是通过将每个for或if子句视为块,从左到右嵌套,以及每次到达最内部块时评估表达式以产生列表元素而生成的元素.
换句话说,既然你基本上想要道德等同于:
allfiles = []
for root, dirs, files in walk(root):
for f in files:
allfiles.append(f)
Run Code Online (Sandbox Code Playgroud)
你的列表理解应遵循相同的顺序.
它是:
allfiles = [join(root, f) for _, dirs, files in walk(root) for f in files]
Run Code Online (Sandbox Code Playgroud)