是否有一种很好的方法来生成一个数字列表(0-9),重复和长度为6,这样总和就是N,比如20。例如:
004673 -> 4+6+7+3=20
121673 -> 1+2+1+6+7+3=20
...
由于
答案 0 :(得分:12)
['{0:06}'.format(i) for i in xrange(1000000) if sum(map(int,str(i))) == 20]
完成技巧并需要大约5秒才能返回所有35127个数字。
更新 - 作为奖励,这里出现了丑陋但速度更快(约40倍)的版本:
result = []
for a in xrange(10):
for b in xrange(10):
for c in xrange(10):
if a+b+c <= 20:
for d in xrange(10):
if 2 < a+b+c+d <= 20:
for e in xrange(10):
if 10 < a+b+c+d+e <= 20:
f = 20 - (a+b+c+d+e)
result.append(''.join(map(str, [a,b,c,d,e,f])))
答案 1 :(得分:6)
其他提出的解决方案要快得多:
def iter_fun(sum, deepness, myString, Total):
if deepness == 0:
if sum == Total:
print myString
else:
for i in xrange(min(10, Total - sum + 1)):
iter_fun(sum + i,deepness - 1,myString + str(i),Total)
def fixed_sum_digits(digits, Tot):
iter_fun(0,digits,"",Tot)
fixed_sum_digits(6,20)
仍有一些空间用于调速器代码,但是代码将无聊被阅读!
答案 2 :(得分:2)
使用itertools
和排列:
>>> from itertools import product
>>> l = []
>>> for digits in product('0123456789', repeat=6):
... if sum(map(int, digits)) == 20:
... l.append(digits)
...
>>> len(l)
35127
>>> l[1234]
('0', '1', '9', '0', '5', '5')
似乎比eumiro的快一点:
>>> stm = """l = []
... for digits in product('0123456789', repeat=6):
... if sum(map(int, digits)) == 20:
... l.append(digits)
... """
>>> timeit.timeit(stm, setup="from itertools import product", number=3)
10.368315935134888
>>> timeit.timeit("['{0:06}'.format(i) for i in xrange(1000000) if sum(map(int,str(i))) == 20]", number=3)
14.926225900650024
答案 3 :(得分:-1)
你可以使用numpy。
import numpy
a=[1,2,1,6,7,3]
print(numpy.cumsum(a)[-1])