Python:嵌套'for'循环

098*_*799 16 python for-loop nested

我想通过所有的n位数字,这样数字的第二个数字总是低于或等于第一个数字,第三个数字低于或等于第二个等等.我可以通过写一个可怕的代码来得到这个,例如:

for i in range(10):
    for j in range(i+1):
        for k in range(j+1):
Run Code Online (Sandbox Code Playgroud)

等等,但是有了10位数字,我的代码看起来很可怕,而且这也是很多写作,如果我想赞扬其中的一些,缩进就会变得很糟糕.得到这个有一个很好,简洁的方法吗?

编辑:只是为了让人们知道我为什么这么烦,https: //projecteuler.net/problem=74让我检查1到1个数字的数字.不幸的是,它并不像我想象的那么简单 - 带有前导零的数字与内部带有零的数字区别对待,因此必须执行一些额外的魔法.无论如何,感谢所有有见地的建议.

Ste*_*ann 22

可以用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)
Run Code Online (Sandbox Code Playgroud)

或者递归地,附加越来越多的数字直到足够,这可以更直接地产生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)
Run Code Online (Sandbox Code Playgroud)

演示(注意它没有" 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
Run Code Online (Sandbox Code Playgroud)