Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个很好的方法来找到所有的组合,给出一个N的总和?_Python - Fatal编程技术网

Python 一个很好的方法来找到所有的组合,给出一个N的总和?

Python 一个很好的方法来找到所有的组合,给出一个N的总和?,python,Python,有没有一种很好的方法来生成一个数字列表(0-9),重复次数和长度为6,这样的和就是N,比如说20。例如: 004673 -> 4+6+7+3=20 121673 -> 1+2+1+6+7+3=20 ... 谢谢 完成此操作后,需要大约5秒钟才能返回所有35127个数字 更新-作为奖励,下面是一个丑陋但速度快得多(约40倍)的版本: result=[] 对于X范围(10)内的a: 对于X范围内的b(10): 对于X范围内的c(10): 如果a+b+c使用itertools和置换: &

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

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

完成此操作后,需要大约5秒钟才能返回所有35127个数字

更新-作为奖励,下面是一个丑陋但速度快得多(约40倍)的版本:

result=[]
对于X范围(10)内的a:
对于X范围内的b(10):
对于X范围内的c(10):

如果a+b+c使用
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

比其他建议的解决方案快得多:

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)

仍然有一些空间的速度代码,但这样的代码将是无聊的阅读

这是家庭作业吗?你试过什么?你只是想知道如何对一串数字求和,还是想生成这样的字符串?这不是家庭作业——我知道这听起来像是家庭作业。我这样做效率太低了。事实上,我在帖子中很粗心——事实上,我正在尝试生成那些字符串。非常聪明。还有一个额外的好处就是井然有序。快速的
time.time()
检查表明,如果您只是显示所有这些数字,那么使用列表理解或生成器版本之间几乎没有什么区别。“repmutation”听起来可能是一些严重的堆栈溢出错误。o.o是否
组合使用替换('0123456789',repeat=6)
更快?我想它会给出169个结果,但我无法测试(Python2.6.5似乎没有组合_和_替换)。@steenslag是的,我考虑过,但我也使用Python2.6:)35127个解决方案,如果只计算一次060266和600266,则为169个。这只花了几分之一秒的时间(大部分时间用于在屏幕上打印)。请以最快、更优雅的方式投票……您可以通过将
continue
更改为
break
+1来稍微加快速度。我希望你不介意我优化了一点循环。我很高兴你这么做了。现在我看不到进一步优化的空间;-)
>>> 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
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)