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