如何解决Python-嵌套在地图中的过滤器会产生意外的输出
我有一个文件名(字符串)列表和一组由浮点数组成的ls。最初,我想根据预定的表达式过滤与ls的每个元素匹配的所有文件:
我将所有实际上是整数的浮点数转换为整数,并将其输入.format
中以创建适当的搜索字符串(exprs
)。这将产生预期的字符串序列。我现在想使用re.search过滤“文件”,但是据我了解,我需要为exprs的每个输出使用不同的过滤器。所以我将其嵌套在map函数中:
t = 'Matrix'
exprs = map('{}_spike_{}_D1_1'.format,cycle([t]),(int(x) if x.is_integer() else x for x in ls))
y = map(lambda f:filter(lambda i : re.search(f,i),files),exprs)
Print(next(exprs))
产生预期的输出,即'Matrix_spike_50_D1_1'
。如果我“冻结” re.search中的表达式,即通过执行b = next(exprs)
和re.search(b,[...])
,我将得到预期的输出(即正确选择的文件名)。
但是,当我尝试使用map
消耗exprs
的所有输出并返回结果filter([...])
时,我得到了
- 过滤器对象而不是地图对象
- 两个相同过滤器对象,当通过
while True
进行详尽运行时,捕获所有StopIterations
并恢复
如何修改此设置以返回过滤器为每个exprs返回的文件?
解决方法
如果我正确理解了您的问题,那么您会看到以下文件列表:
riscv32-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles test.c -Wl,-T,${own_linker_script }
和浮点数列表,这些浮点数应为整数(但可能不是全部):
files = ['a','b','Matrix_spike_2_D1_1','c','Matrix_spike_4_D1_1']
从ls = [1.1,2.0,3.0,4.0,5.0]
整数列表中,构造名称'Matrix_spike_2_D1_1','Matrix_spike_3_D1_1'等,然后从ls
列表中选择满足{{1 }}。当然,不使用files
和rex.search
锚点的方法search
不会进行完全匹配,因此我想知道您是否真的打算使用^
方法。 / p>
首先,您有:
$
我相信这可以简化为:
fullmatch
请注意,我只是从t = 'Matrix'
exprs = map('{}_spike_{}_D1_1'.format,cycle([t]),(int(x) if x.is_integer() else x for x in ls))
中选择整数,我认为这是您的意图。按照您的方法,我认为最简单的补救方法是定义一个函数exprs = map('Matrix_spike_{}_D1_1'.format,(int(x) for x in ls if x.is_integer())
:
ls
打印:
filter_func
或者采用更具“功能性”但可能效率较低的方法:
import re
ls = [1.1,5.0]
files = ['a','Matrix_spike_4_D1_1']
exprs = list(map(re.compile,map('Matrix_spike_{}_D1_1'.format,(int(x) for x in ls if x.is_integer()))))
def filter_func(f):
for expr in exprs:
if expr.search(f):
return True
return False
matched_files = list(filter(filter_func,files))
print(matched_files)
打印:
['Matrix_spike_2_D1_1','Matrix_spike_4_D1_1']
但是我相信您的方法并不是最有效的。您应该改为对import re
import operator
import functools
ls = [1.1,(int(x) for x in ls if x.is_integer()))))
filter_func = lambda f: functools.reduce(operator.or_,map(lambda expr: bool(expr.search(f)),exprs),False)
matched_files = list(filter(filter_func,files))
print(matched_files)
列表中的每个元素执行单个正则表达式搜索。在上面的示例中,该正则表达式为:
['Matrix_spike_2_D1_1','Matrix_spike_4_D1_1']
在上面的正则表达式中,您将files
列表中的每个元素与您要查找的所有4个可能的文件名匹配。这样可以将代码减少为:
rex = re.compile('Matrix_spike_(?:2|3|4|5)_D1_1')
打印:
files
如果您要对文件名进行完全匹配(相等),那么以下代码将是最有效的,因为它会将您要查找的名称添加到集合中,并且每个比较都将是恒定时间查找:
import re
ls = [1.1,'Matrix_spike_4_D1_1']
sub_rex = '|'.join(str(int(x)) for x in ls if x.is_integer())
rex = re.compile('Matrix_spike_(?:' + sub_rex + ')_D1_1');
matched_files = list(filter(rex.search,files))
print(matched_files)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。