找到所有N组合的组合的好方法?

时间:2011-12-23 15:01:32

标签: python

是否有一种很好的方法来生成一个数字列表(0-9),重复和长度为6,这样总和就是N,比如20。例如:

004673 -> 4+6+7+3=20
121673 -> 1+2+1+6+7+3=20
...

由于

4 个答案:

答案 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])