我有一个总密度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)]
还有其他想法吗?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐