首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for循环没有正确地迭代python。

for循环没有正确地迭代python。
EN

Stack Overflow用户
提问于 2021-06-14 08:07:56
回答 2查看 100关注 0票数 0

我不知道我做错了什么,但我的for循环没有按照我想要的方式工作。

代码语言:javascript
复制
import re

liste  = ["train_seg/aoi105_c1_20_A", "train_seg/aoi105_c1_30_A", "train_seg/aoi105_c1_30_B", 
          "train_seg/aoi98_c1_20_A", "train_seg/aoi98_c1_30_A", "train_seg/aoi98_c1_30_B", 
          "train_classes/aoi98_c1_20_A", "train_classes/aoi98_c1_30_A", "train_classes/aoi98_c1_30_B",
         "train_classes/aoi105_c1_20_A", "train_classes/aoi105_c1_30_A", "train_classes/aoi105_c1_30_B"]

cat = ["c1"]
seg = ["20", "30"]
com = ["A", "B"]

for x in cat:
    for y in seg:
        for z in com:
            if y == "20" and z == "B":
                continue
            #print(x,y,z)
            
            for s in liste:
                if all(a in s for a in ["aoi105", x, y, z]):
                    #print(s)
                    
                    if re.findall("train_seg", s):
                        print(s)
                        
                    if re.findall("train_classes", s):
                        print(s)
                        
                if all(a in s for a in ["aoi98", x, y, z]):
                    #print(s)

                    if re.findall("train_seg", s):
                        print(s)

                    if re.findall("train_classes", s):
                        print(s)

我希望列表中的元素"liste“按以下顺序计算:

代码语言:javascript
复制
train_seg/aoi105_c1_20_A
train_classes/aoi105_c1_20_A
train_seg/aoi98_c1_20_A
train_classes/aoi98_c1_20_A

train_seg/aoi105_c1_30_A
train_classes/aoi105_c1_30_A
train_seg/aoi98_c1_30_A
train_classes/aoi98_c1_30_A

train_seg/aoi105_c1_30_B
train_classes/aoi105_c1_30_B
train_seg/aoi98_c1_30_B
train_classes/aoi98_c1_30_B

为什么每一行都没有按正确的顺序进行评估?我希望train_seg和train_classes首先对每个数字进行评估。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-14 08:30:16

答案很简单。你差点就成功了。你增加了额外的打印语句,这导致了问题的出现。

代码语言:javascript
复制
import re

cat = ["c1"]
seg = ["20", "30"]
com = ["A", "B"]
tag = ["aoi105","aoi98"]
for x in cat:
    for y in seg:
        for z in com:
            for i in tag:
                if y == "20" and z == "B":
                    continue            
                for s in liste:                    
                    train_seg = f'''train_seg/{i}_{x}_{y}_{z}'''
                    train_classes = f'''train_classes/{i}_{x}_{y}_{z}'''
                    if re.findall(train_seg, s): print(s)                        
                    if re.findall(train_classes, s): print(s)
票数 1
EN

Stack Overflow用户

发布于 2021-06-14 08:52:45

像这样循环,有那么多级别的嵌套循环,是以正确的顺序获得项目的一种迂回方式。它可能通过在for s in liste:之前添加第二个if all(a in s for a in ["aoi98", x, y, z]):来工作。

但我认为有一个更好的方法:显式地按所需的顺序对项目进行排序。类似这样的内容(为错误的变量命名道歉,这是由于我对问题域缺乏了解造成的):

(编辑:更清晰和更短)

代码语言:javascript
复制
import re

liste  = ["train_seg/aoi105_c1_20_A", "train_seg/aoi105_c1_30_A", "train_seg/aoi105_c1_30_B", 
          "train_seg/aoi98_c1_20_A", "train_seg/aoi98_c1_30_A", "train_seg/aoi98_c1_30_B", 
          "train_classes/aoi98_c1_20_A", "train_classes/aoi98_c1_30_A", "train_classes/aoi98_c1_30_B",
         "train_classes/aoi105_c1_20_A", "train_classes/aoi105_c1_30_A", "train_classes/aoi105_c1_30_B"]

TRAIN_TYPES_ORDER = ['train_seg', 'train_classes']
AOIS_ORDER = ['aoi105', 'aoi98']
CATS_ORDER = ['c1']
SEGS_ORDER = ['20', '30']
COMS_ORDER = ['A', 'B']

def sort_key(item):
    train_type, aoi, cat, seg, com = re.fullmatch(r'(.*)/(.*)_(.*)_(.*)_(.*)', item).groups()
    return (
        COMS_ORDER.index(com),
        SEGS_ORDER.index(seg),
        CATS_ORDER.index(cat),
        AOIS_ORDER.index(aoi),
        TRAIN_TYPES_ORDER.index(train_type),
    )

sorted_items = sorted(liste, key=sort_key)
for item in sorted_items:
    print(item)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67966825

复制
相关文章

相似问题

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