【发布时间】:2020-03-25 05:30:58
【问题描述】:
我有一个总密度 N。我需要找到可以将该密度分成 k 个组的所有方法,假设有一些最小可分部分 d。
所以,如果 N=4,k=3,d=1,我需要:
[
(1, 1, 2),
(1, 2, 1),
(2, 1, 1),
]
如果 N=5,k=3,d=1:
[
(1, 1, 3),
(1, 3, 1),
(3, 1, 1),
(1, 2, 2),
(2, 1, 2),
(2, 2, 1),
]
感觉这样应该符合一些基本的组合问题,但我想不出来。 This post 在 R 中引用了一个非常相似的操作,但不是 python。
一种天真的做事方式是将itertools.product 的结果过滤为仅总和为N 的元组,但这感觉不优雅:
import itertools
def compositions(N, k, d=1):
for seq in itertools.product(*[range(d, N, d)] * k):
if sum(seq) == N:
yield seq
例子
>>> list(compositions(7, 3))
[(1, 1, 5),
(1, 2, 4),
(1, 3, 3),
(1, 4, 2),
(1, 5, 1),
(2, 1, 4),
(2, 2, 3),
(2, 3, 2),
(2, 4, 1),
(3, 1, 3),
(3, 2, 2),
(3, 3, 1),
(4, 1, 2),
(4, 2, 1),
(5, 1, 1)]
还有其他想法吗?
【问题讨论】:
标签: python combinatorics