如何压缩Python中重复嵌套的FOR循环?
嘿,作为编程新手能写出这样完整的代码已经超棒啦!你遇到的多层重复嵌套循环问题,其实Python已经给我们准备了很方便的工具来解决,不用手动写7层for循环,代码结构会清爽很多,我来给你详细讲讲~
核心思路:用笛卡尔积替代嵌套循环
你写的7层循环本质上是在求7个列表中各取一个元素的所有可能组合,然后对每个组合计算平方和模y的值。这种“多列表所有组合”的需求,正好可以用Python标准库中的itertools.product来实现——它会帮你自动生成所有组合,完全替代手动嵌套的循环。
具体步骤拆解
先提取需要组合的子列表
首先把你原来循环里的inp[0][1:inp[0][0]+1]、inp[1][1:inp[1][0]+1]...这些子列表统一收集起来,用列表推导式就能轻松搞定:lists_to_combine = [item[1:item[0]+1] for item in inp]这样
lists_to_combine就是包含7个待组合列表的大列表,不管后续需要组合的列表数量是多少,这行代码都不用改。用
itertools.product生成所有组合
导入itertools模块后,调用product(*lists_to_combine)就能得到所有元素的组合(每个组合是一个元组,比如(a,b,c,d,e,f,g))。然后我们就可以遍历这些组合,计算对应的结果:import itertools # 直接计算所有组合的结果并取最大值,甚至不用额外存列表 max_result = max( sum(num**2 for num in combo) % y for combo in itertools.product(*lists_to_combine) )这里用了生成器表达式直接计算最大值,比先把所有结果存到列表再取max更节省内存,效率也更高。
修改后的完整代码
把这些逻辑整合到你的代码里,最终版本是这样的:
import itertools x, y = map(int, input().split()) inp = [] for _ in range(x): inp.append(list(map(int, input().split()))) # 补充占位值到7个元素 while len(inp) < 7: inp.append([1, 0]) # 提取所有待组合的子列表 lists_to_combine = [item[1:item[0]+1] for item in inp] # 计算所有组合的结果并输出最大值 max_result = max(sum(num**2 for num in combo) % y for combo in itertools.product(*lists_to_combine)) print(max_result)
小提醒
原代码里你用了list作为变量名,这其实不太好——因为list是Python的内置类型,这样会覆盖它原本的功能,建议换成results之类的名字哦(不过上面的优化版已经不需要这个变量了😉)。
如果暂时不想用标准库模块,也可以用递归的方式实现组合遍历,但递归对新手来说理解成本稍高,所以优先推荐itertools.product这种简洁且高效的方案。
内容的提问来源于stack exchange,提问作者Shub




