假设我有一个数字列表(不按任何特定顺序,允许重复(。例如
[3 3 7 6]
假设我有一组垃圾箱(没有容量限制,这不是优化问题(,例如3个垃圾箱。我想生成所有可以将列表分发到垃圾箱的组合方式。订单必须保持不变,垃圾箱不能为空。我想要的输出是
[3 3] [7] [6]
[3] [3 7] [6]
[3] [3] [7 6]
你可以把这看作一个等价的组合数学问题,它会说你有一个字符串"3376",你需要插入两个";唾沫;创建三个子字符串,如下所示:
33|7|6
3|37|6
3|3|76
我的目标是生成一个所有有效抛出字符串的列表。更喜欢python中的答案(或起点/线索(。
这应该可以实现您想要的:
from itertools import combinations
vals = [3, 3, 7, 6]
nbins = 3
for c in combinations(range(1, len(vals)), nbins - 1):
bvals = [vals[i:j] for i, j in zip((0,) + c, c + (len(vals),))]
print(bvals)
这产生:
[[3], [3], [7, 6]]
[[3], [3, 7], [6]]
[[3, 3], [7], [6]]