我想计算一个向量的组合。
我可以使用itertools::Itertools:combinations
特征轻松地做到这一点,如下所示:
vec![1, 2, 3].iter().combinations(2).for_each(|x| {
println!("{:?}", x);
});
但是我想指定组合长度以及这些长度的计数。
values = [0, 1, 2, 3, 4]
# 1 group with a length of 3 and 1 group with a length of 2
len_counts = { 3: 1, 2: 1 }
combinations = [
[{0, 1, 2}, {3, 4}]
[{0, 1, 3}, {2, 4}]
[{0, 1, 4}, {2, 3}]
[{0, 2, 3}, {1, 4}]
[{0, 2, 4}, {1, 3}]
[{0, 3, 4}, {1, 2}]
[{1, 2, 3}, {0, 4}]
[{1, 2, 4}, {0, 3}]
[{1, 3, 4}, {0, 2}]
[{2, 3, 4}, {0, 1}]
]
我希望它是惰性加载和尽可能干净。我试图得到这个输出了一段时间,但不能成功。任何帮助是感激。
编辑:用于表示变量的组合和数据结构的顺序并不重要。
2条答案
按热度按时间bweufnob1#
经过一堆的思考,我很遗憾地不能拿出一个干净和容易的解决方案。
尽管如此,我还是想出了一个解决办法:)虽然这里很乱,但我担心:D
第一个
gcuhipw92#
听起来你想要做的是将一系列
n
项划分成m
集合,每个集合都有一个预定义的长度。你可以使用递归方法来实现这一点:给定一系列长度
lengths
和所需的事物列表items
:lengths
是否为空,如果是,则产生空列表并停止lengths
弹出第一个长度并将其存储在current_length
中1.生成新列表
remaining_items
,其中包含items
中未包含在combination
中的所有项lengths
和remaining_items
递归调用此函数,并对每个结果rest
执行以下操作:combination
的rest
这将给予你一个生成器,它将产生所需的结果,没有任何重复。
如果您可以每晚使用rust和
itertools
库,则实现如下:您可以通过以下方式调用从0到n的一系列数字:
这将产生以下输出:
由于rust的实现可能有点难以理解,因为有些笨拙的生成器人体工程学,下面是一个python实现: