将过滤器应用于列表时如何找到模式?
How can I find patterns when applying a filter to a list?
我正在应用过滤器来查找符合某些条件的文件夹列表。
例如,当我有几个文件夹的名称类似于 a_1_1_1 时,a_2_2_2 我会
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and x[1]=='_', os.listdir(d)))
其中 d 是基本文件夹。
然后,如果我有一些包含多个子文件夹的文件夹,其名称如 ab_1_1_1 和 ab_1_2_3
我必须用
更改以上内容
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and x[2]=='_', os.listdir(d)))
这很麻烦而且不笼统,所以我想用更笼统的东西替换 x[n]=='_'
条件' 例如列出具有三个 _
的文件夹,在 _
.
如何将这种模式引入到表达式中? (我听说过正则表达式,但我不知道怎么做)
一个实现可能是在 "_"
上使用 split
并查看你得到的长度是否为 4 所有(除了第一个拆分部分)都是使用 all
的数字:
out = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and len(x.split('_'))==4 and all(i.lstrip('-').isdigit() for i in x.split('_')[1:]), os.listdir(d)))
但我认为使用 for-loop 而不是 filter
来编写它可能更具可读性:
out = []
for x in os.listdir(d):
if os.path.isdir(os.path.join(d, x)):
s = x.split('_')[1:]
if len(s) == 3 and all(i.lstrip('-').isdigit() for i in s):
out.append(x)
我正在应用过滤器来查找符合某些条件的文件夹列表。
例如,当我有几个文件夹的名称类似于 a_1_1_1 时,a_2_2_2 我会
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and x[1]=='_', os.listdir(d)))
其中 d 是基本文件夹。
然后,如果我有一些包含多个子文件夹的文件夹,其名称如 ab_1_1_1 和 ab_1_2_3 我必须用
更改以上内容folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and x[2]=='_', os.listdir(d)))
这很麻烦而且不笼统,所以我想用更笼统的东西替换 x[n]=='_'
条件' 例如列出具有三个 _
的文件夹,在 _
.
如何将这种模式引入到表达式中? (我听说过正则表达式,但我不知道怎么做)
一个实现可能是在 "_"
上使用 split
并查看你得到的长度是否为 4 所有(除了第一个拆分部分)都是使用 all
的数字:
out = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and len(x.split('_'))==4 and all(i.lstrip('-').isdigit() for i in x.split('_')[1:]), os.listdir(d)))
但我认为使用 for-loop 而不是 filter
来编写它可能更具可读性:
out = []
for x in os.listdir(d):
if os.path.isdir(os.path.join(d, x)):
s = x.split('_')[1:]
if len(s) == 3 and all(i.lstrip('-').isdigit() for i in s):
out.append(x)