将列表中的项目分发到python中固定数量的bin中的所有组合



假设我有一个数字列表(不按任何特定顺序,允许重复(。例如

[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]]

最新更新