根据列表创建一个 1-4 个数字的列表,这些数字添加到一个 x 数字

Creating a list of 1-4 numbers that add to an x number according to a list

然而我仍然没有得到任何结果,我想要做的就是根据我从 API 中得到的数字列表创建一个数字列表,该列表加起来是例如某些 X 号。

它不应包含重复项,并且必须是 1 - 4 个数字。

预制列表:

[200, 500, 700, 199, 200, 54543, 432]

假设我想创建一个加起来等于或小于 1500 的数字列表 应该return

[700, 500, 200]

一种直接(未优化)的方法是生成所有可能的组合 c,然后过滤出具有 sum(c) <= 1500:

的组合
>>> premade_list = [200, 500, 700, 199, 200, 54543, 432]
>>> import itertools
>>> [list(c) for n in range(1, 5) for c in itertools.combinations(premade_list, n) if sum(c) <= 1500]
[[200], [500], [700], [199], [200], [432], [200, 500], [200, 700], [200, 199], [200, 200], [200, 432], [500, 700], [500, 199], [500, 200], [500, 432], [700, 199], [700, 200], [700, 432], [199, 200], [199, 432], [200, 432], [200, 500, 700], [200, 500, 199], [200, 500, 200], [200, 500, 432], [200, 700, 199], [200, 700, 200], [200, 700, 432], [200, 199, 200], [200, 199, 432], [200, 200, 432], [500, 700, 199], [500, 700, 200], [500, 199, 200], [500, 199, 432], [500, 200, 432], [700, 199, 200], [700, 199, 432], [700, 200, 432], [199, 200, 432], [200, 500, 199, 200], [200, 500, 199, 432], [200, 500, 200, 432], [200, 700, 199, 200], [200, 199, 200, 432], [500, 199, 200, 432]]

如果您特别想找到最接近 到 1500 的单个项目,则可以取 min 的差值:

>>> list(min((
...     c for n in range(1, 5)
...     for c in itertools.combinations(premade_list, n)
...     if sum(c) <= 1500
... ), key=lambda c: 1500 - sum(c)))
[200, 500, 700]