我有一个数字列表:
[4, 2, 6, 18, 5, 3, 15]
我需要找到给我21岁的所有组合。
如何实现?
答案 0 :(得分:1)
使用itertools.combinations
:
>>> for i in range(1, len(xs)):
... for comb in combinations(xs, i):
... if sum(comb) == 21:
... print(list(comb))
...
[6, 15]
[18, 3]
[4, 2, 15]
答案 1 :(得分:0)
如果试图在较大的列表上加快速度,则可以减少计算和使用记忆功能所需的组合数量。这是一种递归方法,将修剪数目大于当前总和的树。它使用lru_cache
中的functools
来进行记忆,但是如果您希望看到它可以工作的话,用字典来实现它并不难。如果您花了点时间,应该会发现它比搜索所有组合的方法更快地工作:
from functools import lru_cache
@lru_cache()
def findsums(arr, target):
ret = []
for i, n in enumerate(arr):
if n == target:
ret.append([n])
elif n < target and i < len(arr) - 1:
p = findsums(arr[i+1:], target - n)
ret.extend([n] + arr for arr in p )
return ret
xs = (4, 2, 6, 18, 5, 3, 15)
findsums(xs, 21)
>> [[4, 2, 15], [6, 15], [18, 3]]