首页 > 解决方案 > 在 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'

标签: pythonfor-loop

解决方案


假设这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")

推荐阅读