如果您不关心输出序列中值的顺序,则列表中加起来为 1 的值的 5 值组合的数量非常少。但是,在您提出的特定情况下,计算起来有点复杂,因为浮点值存在舍入问题。如果您使用一组整数(例如range(11)
)并找到加起来为 10 的组合,则可以更轻松地解决该问题。然后,如果您需要小数值,只需将结果中的值除以 10。
无论如何,这是一个生成器,它产生所有可能的集合,这些集合加起来为给定值:
def picks(values, n, target):
if n == 1:
if target in values:
yield (target,)
return
for i, v in enumerate(values):
if v <= target:
for r in picks(values[i:], n-1, target-v):
yield (v,)+r
以下是数字 0 到 10 的结果:
>>> for r in picks(range(11), 5, 10):
print(r)
(0, 0, 0, 0, 10)
(0, 0, 0, 1, 9)
(0, 0, 0, 2, 8)
(0, 0, 0, 3, 7)
(0, 0, 0, 4, 6)
(0, 0, 0, 5, 5)
(0, 0, 1, 1, 8)
(0, 0, 1, 2, 7)
(0, 0, 1, 3, 6)
(0, 0, 1, 4, 5)
(0, 0, 2, 2, 6)
(0, 0, 2, 3, 5)
(0, 0, 2, 4, 4)
(0, 0, 3, 3, 4)
(0, 1, 1, 1, 7)
(0, 1, 1, 2, 6)
(0, 1, 1, 3, 5)
(0, 1, 1, 4, 4)
(0, 1, 2, 2, 5)
(0, 1, 2, 3, 4)
(0, 1, 3, 3, 3)
(0, 2, 2, 2, 4)
(0, 2, 2, 3, 3)
(1, 1, 1, 1, 6)
(1, 1, 1, 2, 5)
(1, 1, 1, 3, 4)
(1, 1, 2, 2, 4)
(1, 1, 2, 3, 3)
(1, 2, 2, 2, 3)
(2, 2, 2, 2, 2)
您可以随机选择其中一个(使用random.choice
),或者如果您打算使用其中的许多并且不想重复自己,则可以使用random.shuffle
,然后进行迭代。
results = list(picks(range(11), 5, 10))
random.shuffle(results)
for r in results:
# do whatever you want with r