gpt4 book ai didi

Python:嵌套的 'for' 循环

转载 作者:太空狗 更新时间:2023-10-29 16:53:03 25 4
gpt4 key购买 nike

我想遍历所有 n 位数字,以便数字的第二位始终小于或等于第一位,第三位小于或等于第二位等等。我可以通过编写一个可怕的代码来实现比如:

for i in range(10):
for j in range(i+1):
for k in range(j+1):

等,但是对于 10 位数字,我的代码开始看起来很糟糕,而且写了很多东西,如果我想表扬其中的一些代码,缩进会变得很糟糕。有没有一种简洁明了的方法?

编辑:只是为了让人们知道我为什么为此烦恼,https://projecteuler.net/problem=74让我检查从 1 到 100 万的数字。不幸的是,它并不像我想象的那么简单——带有前导零的数字与内部带有零的数字的处理方式不同,因此必须执行一些额外的魔法。无论如何,感谢大家提出有见地的建议。

最佳答案

可以使用itertools:

>>> for comb in itertools.combinations_with_replacement(range(9, -1, -1), 3):
print comb

(9, 9, 9)
(9, 9, 8)
(9, 9, 7)
(9, 9, 6)
...
(4, 0, 0)
(3, 3, 3)
(3, 3, 2)
(3, 3, 1)
(3, 3, 0)
(3, 2, 2)
(3, 2, 1)
(3, 2, 0)
(3, 1, 1)
(3, 1, 0)
(3, 0, 0)
(2, 2, 2)
(2, 2, 1)
(2, 2, 0)
(2, 1, 1)
(2, 1, 0)
(2, 0, 0)
(1, 1, 1)
(1, 1, 0)
(1, 0, 0)
(0, 0, 0)

或者递归地,附加越来越多的数字直到足够,这可以更直接地生成 int 对象而不是数字元组(不确定这是否是您真正需要的):

def build(enough, prefix=0):
if prefix >= enough:
print(prefix)
return
for digit in range(prefix % 10 + 1) if prefix else range(1, 10):
build(enough, prefix * 10 + digit)

演示(请注意它遗漏了“000”,不确定您是否想要它):

>>> n = 3
>>> build(10**(n-1))
100
110
111
200
210
211
220
221
222
300
310
311
320
321
322
330
331
332
333
400
410
411
420

关于Python:嵌套的 'for' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41764579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com