Python for循环迭代顺序不符合预期,如何调整实现指定顺序匹配列表元素
问题原因
你当前代码输出顺序不符合要求,核心问题出在匹配逻辑是按liste列表的原生存储顺序遍历查找:
- 你的
liste列表前6项全是train_seg开头的元素,后6项才是train_classes开头的元素 - 对每个
(x,y,z)组合,你是从头到尾扫整个liste,所以会先打印所有匹配的train_seg元素(先aoi105、再aoi98),再打印所有匹配的train_classes元素(先aoi98、再aoi105),自然和你要的「同一个aoi先出seg、再出classes,aoi105全匹配完再处理aoi98」的顺序不一致。
解决方法
方案1:直接构造目标路径(最高效,无需遍历列表)
因为你已经明确了所有参数组合,不需要遍历liste匹配,直接按你要的顺序拼接路径即可:
cat = ["c1"] seg = ["20", "30"] com = ["A", "B"] aoi_list = ["aoi105", "aoi98"] type_list = ["train_seg", "train_classes"] for x in cat: for y in seg: for z in com: if y == "20" and z == "B": continue # 按aoi顺序、类型顺序输出 for aoi in aoi_list: for typ in type_list: target = f"{typ}/{aoi}_{x}_{y}_{z}" print(target) # 每组输出后加空行,和你要的格式一致 print()
方案2:必须从liste中匹配的场景
如果需要确认路径存在于liste中再输出,就按你要的优先级主动查找,不要遍历整个liste:
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"] aoi_list = ["aoi105", "aoi98"] type_list = ["train_seg", "train_classes"] for x in cat: for y in seg: for z in com: if y == "20" and z == "B": continue for aoi in aoi_list: for typ in type_list: # 主动匹配目标元素 match_item = next((s for s in liste if all(a in s for a in [aoi, x, y, z, typ])), None) if match_item: print(match_item) print()
两种方案都能完全输出你要求的顺序结果。
内容的提问来源于stack exchange,提问作者delViento
相关产品推荐
相关产品推荐

