gpt4 book ai didi

python - 在 Python 中生成总和为 S 的所有可能的长度 N 列表

转载 作者:太空狗 更新时间:2023-10-30 02:05:55 26 4
gpt4 key购买 nike

我正在尝试生成总和为 S 的所有可能的长度 N 列表。我已经为此编写了一些代码,但是对于任何大的(特别是,我希望 N=5,S=100),我遇到内存溢出错误。

我正在寻找问题的更好解决方案,或者改进我的代码的方法,以便我可以在 N=5、S=100 上运行它。下面这两个程序协同工作,在嵌套列表中创建所有可能的数字组合,然后将它们重新处理为正确的格式。下面转载了一些示例输出。

我知道我的代码不是最好的。我是一名工程师(我知道,我知道),所以编码并不是我的强项。感谢您提供的任何帮助。

编辑:我只是想澄清几件事。首先,列表中有零是可以的,列表可以包含相同数字的倍数,并且列表中数字的顺序很重要。

def nToSum(N,S):
''' Creates a nested list of all possible lists of length N that sum to S'''
if N <= 1: #base case
return [S]
else:
L = []
for x in range(S+1): #create a sub-list for each possible entry of 0 to S
L += [[x,nToSum(N-1,S-x)]] #create a sub-list for this value recursively
return L

def compress(n=[],L): #designed to take in a list generated by nToSum
'''takes the input from nToSum as list L, and then flattens it so that each list is a
top level list. Leading set n is the "prefix" list, and grows as you climb down the
sublists'''
if type(L[0]) == int: #base case: you have exposed a pure integer
return [n+L] #take that integer, and prepend the leading set n
else:
Q = []
for x in L: # look at every sublist
Q += compress(n+[x[0]],x[1]) # for each sublist, create top level lists recursively
return Q # note: append x[0] to leading set n

>>> nToSum(3,3)
[[0, [[0, [3]], [1, [2]], [2, [1]], [3, [0]]]], [1, [[0, [2]], [1, [1]], [2, [0]]]], [2, [[0, [1]], [1, [0]]]], [3, [[0, [0]]]]]

>>> compress([],nToSum(3,3))
[[0, 0, 3], [0, 1, 2], [0, 2, 1], [0, 3, 0], [1, 0, 2], [1, 1, 1], [1, 2, 0], [2, 0, 1], [2, 1, 0], [3, 0, 0]]

最佳答案

使用生成器可以节省内存(如果使用 Python 2,请使用 xrange 而不是 range)。这就是我想出的。它与您的 nToSum 非常相似,不需要compress

def sums(length, total_sum):
if length == 1:
yield (total_sum,)
else:
for value in range(total_sum + 1):
for permutation in sums(length - 1, total_sum - value):
yield (value,) + permutation

L = list(sums(5,100))
print('total permutations:',len(L))

# First and last 10 of list
for i in L[:10] + L[-10:]:
print(i)

输出

total permutations: 4598126
(0, 0, 0, 0, 100)
(0, 0, 0, 1, 99)
(0, 0, 0, 2, 98)
(0, 0, 0, 3, 97)
(0, 0, 0, 4, 96)
(0, 0, 0, 5, 95)
(0, 0, 0, 6, 94)
(0, 0, 0, 7, 93)
(0, 0, 0, 8, 92)
(0, 0, 0, 9, 91)
(98, 0, 2, 0, 0)
(98, 1, 0, 0, 1)
(98, 1, 0, 1, 0)
(98, 1, 1, 0, 0)
(98, 2, 0, 0, 0)
(99, 0, 0, 0, 1)
(99, 0, 0, 1, 0)
(99, 0, 1, 0, 0)
(99, 1, 0, 0, 0)
(100, 0, 0, 0, 0)

关于python - 在 Python 中生成总和为 S 的所有可能的长度 N 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7748442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com