首页 > 解决方案 > 如何生成给定长度的所有可能组合

问题描述

假设我们有一个价格列表items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]

我们希望找到将所有 7 个价格放入桶中的所有可能组合,每个桶中包含以下价格数量[3, 2, 2]。价格是否放置在同一个桶中并不重要,但放置哪个桶价格却很重要。

这个怎么做?我找到了这个答案,但它假设我们只r对给定元素的长度子序列的一种组合感兴趣。然而,在这里,我们也对包含3价格的第一个组合之后的剩余部分感兴趣,然后是2最后一个2

请注意,给定存储桶中的 7 个价格和组合是一般问题的简单案例。

标签: pythonpython-3.xcombinations

解决方案


我可能对此解释有误,如果有的话,我会编辑这个答案,但我假设一组中的顺序无关紧要。

如果是这样,则有 7C5 = 21 种独特的方式(例如,在 3 组中,[1500, 2000, 1600]与 相同[2000, 1600, 1500])。我只是做从 7 中选择 5 个价格的所有唯一组合(不是排列),然后将该 5 拆分为 3 和 2,然后附加未选择为第三组的剩余 2 个值(以任意顺序)。

他们是:

((1600, 1400, 1900), (2000, 2100), (2200, 1500))
((1600, 1400, 1900), (2000, 2200), (1500, 2100))
((1600, 1400, 1900), (2000, 1500), (2200, 2100))
((1600, 1400, 1900), (2100, 2200), (2000, 1500))
((1600, 1400, 1900), (2100, 1500), (2000, 2200))
((1600, 1400, 1900), (2200, 1500), (2000, 2100))
((1600, 1400, 2000), (2100, 2200), (1500, 1900))
((1600, 1400, 2000), (2100, 1500), (2200, 1900))
((1600, 1400, 2000), (2200, 1500), (1900, 2100))
((1600, 1400, 2100), (2200, 1500), (2000, 1900))
((1600, 1900, 2000), (2100, 2200), (1400, 1500))
((1600, 1900, 2000), (2100, 1500), (1400, 2200))
((1600, 1900, 2000), (2200, 1500), (1400, 2100))
((1600, 1900, 2100), (2200, 1500), (1400, 2000))
((1600, 2000, 2100), (2200, 1500), (1400, 1900))
((1400, 1900, 2000), (2100, 2200), (1600, 1500))
((1400, 1900, 2000), (2100, 1500), (1600, 2200))
((1400, 1900, 2000), (2200, 1500), (1600, 2100))
((1400, 1900, 2100), (2200, 1500), (1600, 2000))
((1400, 2000, 2100), (2200, 1500), (1600, 1900))
((1900, 2000, 2100), (2200, 1500), (1600, 1400))

计算自

[(chosen_5[:3], chosen_5[3:5], tuple(set(items_prices) - set(chosen_5))) for chosen_5 in tuple(itertools.combinations(items_prices, 5))]

请注意,在所有 3 个元组中,实际值并不完全相同,即使顺序不同,因为我们不关心值的顺序 - 我们可以将每个顺序中的 3 个元组视为 3 个(冻结)集合.


但是,如果您的意思是各个组中的排序确实很重要,那么有 7 个!= 5040 种可能的排列,这与选择 7 个中的任何 1 个然后之后,6 个剩余的任何 1 个(因为你已经选择了一个)然后 5 个中的 1 个......直到最后 1 个相同。他们都可以计算使用

[(this_permutation[:3], this_permutation[3:5], this_permutation[5:]) for this_permutation in itertools.permutations(items_prices)]
((1500, 2000, 1600), (2100, 2200), (1400, 1900))
((1500, 2000, 1600), (2100, 2200), (1900, 1400))
((1500, 2000, 1600), (2100, 1400), (2200, 1900))
((1500, 2000, 1600), (2100, 1400), (1900, 2200))
((1500, 2000, 1600), (2100, 1900), (2200, 1400))
((1500, 2000, 1600), (2100, 1900), (1400, 2200))
((1500, 2000, 1600), (2200, 2100), (1400, 1900))
((1500, 2000, 1600), (2200, 2100), (1900, 1400))
((1500, 2000, 1600), (2200, 1400), (2100, 1900))
((1500, 2000, 1600), (2200, 1400), (1900, 2100))
((1500, 2000, 1600), (2200, 1900), (2100, 1400))
((1500, 2000, 1600), (2200, 1900), (1400, 2100))
...

请注意,第一个和第二个元组是不同的,因为 2200 和 1500 的顺序不同,在使用组合而不是排列的其他输出中不会区分


推荐阅读