Python 一行程序可以从可能的目录列表中获取文件的平面列表?

Python 一行程序可以从可能的目录列表中获取文件的平面列表?,python,list,python-2.7,directory,Python,List,Python 2.7,Directory,假设我们有一个目录列表,其中一些可能不存在: 为便于论证,仅存在两种,其内容为: dir1 --file1a --file1b dir2 --file2a --file2b 但这给了我一个嵌套列表: [['file1a','file1b'],['file2a','file2b']] 如果我想让它成为['file1a'、'file1b'、'file2a'、'file2b']?我不确定为什么一行程序是你想要的,但这里: files = [path for dir_lst in ma

假设我们有一个目录列表,其中一些可能不存在:

为便于论证,仅存在两种,其内容为:

dir1 --file1a --file1b dir2 --file2a --file2b 但这给了我一个嵌套列表:

[['file1a','file1b'],['file2a','file2b']]

如果我想让它成为
['file1a'、'file1b'、'file2a'、'file2b']

我不确定为什么一行程序是你想要的,但这里:

files = [path for dir_lst in map(os.listdir, filter(os.path.isdir, ['dir1','dir','dir3'])) for path in dir_lst]

这将首先过滤非目录(使用
filter
),然后
映射剩下的
os.listdir
,并使用两个
循环进行聚合。

您可以将项目链接到单个列表中:

from itertools import chain as ch


files = list(ch.from_iterable(os.listdir(x) for x in ['dir1', 'dir', 'dir3'] if os.path.isdir(x)))
我能做到的最短时间是:

from itertools import chain as ch, ifilter as ifil, imap 
from os import path, listdir

files = list(ch.from_iterable(imap(listdir, ifil(path.isdir, ('dir1', 'dir', 'dir3')))))

如果您只想使用名称,那么只需在链对象上迭代。

我们是假设一个深度级别还是任意数量的级别?请选择单个级别<代码>[x代表子列表[os.listdir(x)代表x代表['dir1','dir','dir3']如果os.path.isdir(x)]代表子列表中的x代表子列表]
似乎有点粗糙。@6161612我刚才做了,我预期的是不同的。没有涉及文件夹。没有存在的条件。@61612如果它很简单,请给出一个快速的答案。这将缩短ghis的讨论。顺便说一句,他在上面的评论中为自己的问题提供了一个可能的答案。虽然有点长,但似乎没有变得更简单。谢谢大家!@con-f-use,使其尽可能短而不完全模糊
from itertools import chain as ch


files = list(ch.from_iterable(os.listdir(x) for x in ['dir1', 'dir', 'dir3'] if os.path.isdir(x)))
from itertools import chain as ch, ifilter as ifil, imap 
from os import path, listdir

files = list(ch.from_iterable(imap(listdir, ifil(path.isdir, ('dir1', 'dir', 'dir3')))))