python - 在 for 循环中选择组合?
问题描述
在路径中,我有如下文件:
check1
check1_f
check1_f_line
check2
check2_f
check2_f_line
..
我想制作一个for
将在这些文件的函数组合中使用的循环。
问题
我不确定如何使这些组合对于每个“检查”都将采用正确的组合。
如果它不是用于循环的函数,它将如下所示:
erase('check1','check1_f_line','output_name')
我试过的:
for i, j in path:
if 'f' not in i and 'line' in j:
erase(i, j, i + '_output')
更新
我检查了这个列表,它有一些问题:
li=['check3_dwg_Polyline', 'check2_dwg_Polyline',
'check3_dwg_Polyline_feat_to_polyg',
'check2_dwg_Polyline_feat_to_polyg',
'check3_dwg_Polyline_feat_to_polyg_feat_to_line',
'check2_dwg_Polyline_feat_to_polyg_feat_to_line']
那么这个:
a=[li[i:i+3] for i in range(0, len(li), 3)]
返回:
[['check3_dwg_Polyline',
'check2_dwg_Polyline',
'check3_dwg_Polyline_feat_to_polyg'],
['check2_dwg_Polyline_feat_to_polyg',
'check3_dwg_Polyline_feat_to_polyg_feat_to_line',
'check2_dwg_Polyline_feat_to_polyg_feat_to_line']]
最后:
for base, base_f, base_line in a:
print(base, base_line, base + "_output")
给出:
check3_dwg_Polyline check3_dwg_Polyline_feat_to_polyg check3_dwg_Polyline_output
check2_dwg_Polyline_feat_to_polyg check2_dwg_Polyline_feat_to_polyg_feat_to_line check2_dwg_Polyline_feat_to_polyg_output
上面的组合是正确的,而另一个则不是。有任何想法吗?
新的
例如:
base = [f for f in li if not f.endswith(("_polyg", "_to_line"))]
base_f = {f.strip("_polyg"): f for f in li if f.endswith("_polyg")}
base_line = {f.strip("_to_line"): f for f in li if f.endswith("_to_line")}
[(b, base_f[b], base_line[b]) for b in base]
给出:
KeyError: 'check3_dwg_Polyline'
解决方案
假设这path
是文件名列表,并假设此列表不包含除这些文件之外的文件,并假设文件名按名称排序(如果不是,则对它们进行排序),您可以将列表细分为三块。
>>> [path[i:i+3] for i in range(0, len(path), 3)]
[['check1', 'check1_f', 'check1_f_line'],
['check2', 'check2_f', 'check2_f_line']]
或者,您可以获取“基本”文件(不带后缀),然后获取相应的后缀文件,然后将它们相应地配对。如果某些后缀文件可能不存在,您也可以使用base_f.get(b)
代替base_f[b]
,那么这些元素将None
代替引发异常。
>>> base = [f for f in path if not f.endswith(("_f", "_f_line"))]
>>> base_f = {f.strip("_f"): f for f in path if f.endswith("_f")}
>>> base_line = {f.strip("_f_line"): f for f in path if f.endswith("_f_line")}
>>> [(b, base_f[b], base_line[b]) for b in base]
[('check1', 'check1_f', 'check1_f_line'),
('check2', 'check2_f', 'check2_f_line')]
您问题的这一部分并不完全清楚,但是您可以迭代两个三元组结果列表中的任何一个并erase
相应地调用:
for base, base_f, base_line in triples:
erase(base, base_line, base + "_output")
推荐阅读
- javascript - 如何制作多个下拉菜单?
- java - Jsp字符集编码问题
- r - 如何将 15 个唯一变量提取为 R 中的 4 个选定变量?
- jenkins-pipeline - Artifactory 构建信息 url 不正确
- javascript - 禁用自动选择材质 ui 中的选项
- sql - 从大表中删除/删除列的方法
- reactjs - “typeof QuestionInfo”类型的参数不可分配给“SetStateAction”类型的参数
' - sockets - 为什么使用 mbedTLS yotta 2.3.2 进行安全套接字后,套接字的数据接收会出现延迟?
- python - 如何在csv中获取集群结果?
- python - Python Flask-Mysql KeyError:'MYSQL_HOST'