当前位置:  开发笔记 > 编程语言 > 正文

Python:嵌套'for'循环

如何解决《Python:嵌套'for'循环》经验,为你挑选了1个好方法。

我想通过所有的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到1个数字的数字.不幸的是,它并不像我想象的那么简单 - 带有前导零的数字与内部带有零的数字区别对待,因此必须执行一些额外的魔法.无论如何,感谢所有有见地的建议.



1> Stefan Pochm..:

可以用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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有