首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for循环中选择组合?

在for循环中选择组合?
EN

Stack Overflow用户
提问于 2018-07-25 13:27:37
回答 1查看 45关注 0票数 0

在一条路径中,我有这样的文件:

代码语言:javascript
复制
check1
check1_f
check1_f_line
check2
check2_f
check2_f_line
..

我想做一个for循环,它将在这些文件的函数组合中使用。

问题

我不知道如何使这些组合,对每一个“检查”,它将采取正确的组合。

如果不是用于循环的函数,则如下所示:

代码语言:javascript
复制
erase('check1','check1_f_line','output_name')

我试过的是:

代码语言:javascript
复制
for i, j in path:
    if 'f' not in i and 'line' in j:
        erase(i, j, i + '_output') 

更新

我查过这份清单,它有一些问题:

代码语言:javascript
复制
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']

然后是这个:

代码语言:javascript
复制
a=[li[i:i+3] for i in range(0, len(li), 3)]

返回的地方:

代码语言:javascript
复制
[['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']]

最后:

代码语言:javascript
复制
for base, base_f, base_line in a:
    print(base, base_line, base + "_output")

给予:

代码语言:javascript
复制
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

上面的组合是正确的,而另一个则不正确。有什么想法吗?

新的

例如:

代码语言:javascript
复制
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]

给予:

代码语言:javascript
复制
KeyError: 'check3_dwg_Polyline'
EN

回答 1

Stack Overflow用户

发布于 2018-07-25 13:49:11

假设path是文件名的列表,假设这个列表中除了这些文件之外没有其他文件,并且假设文件名是按名称排序的(如果它们不是,只需对它们排序),您就可以将列表细分为三个块。

代码语言:javascript
复制
>>> [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,而不是引发异常。

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
for base, base_f, base_line in triples:
    erase(base, base_line, base + "_output")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51520114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档