python - 如何生成给定长度的所有可能组合
问题描述
假设我们有一个价格列表items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]
。
我们希望找到将所有 7 个价格放入桶中的所有可能组合,每个桶中包含以下价格数量[3, 2, 2]
。价格是否放置在同一个桶中并不重要,但放置哪个桶价格却很重要。
这个怎么做?我找到了这个答案,但它假设我们只r
对给定元素的长度子序列的一种组合感兴趣。然而,在这里,我们也对包含3
价格的第一个组合之后的剩余部分感兴趣,然后是2
最后一个2
。
请注意,给定存储桶中的 7 个价格和组合是一般问题的简单案例。
解决方案
我可能对此解释有误,如果有的话,我会编辑这个答案,但我假设一组中的顺序无关紧要。
如果是这样,则有 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 的顺序不同,在使用组合而不是排列的其他输出中不会区分
推荐阅读
- php - 自动完成给出 codeigniter3 404 错误
- node.js - 使用 NodeJS 和 Mongoose 在 EJS 中查询数据
- spring-boot - 使用 spring webflux 和 hystrix 的并发调用
- json - 如何检查 JSON 数据是否与 React js 中的特定字符串匹配?
- finite-automata - 非确定性有限自动机接受和拒绝
- angular - 当 mat-toogle-button 为 YES 时,我需要在输入下方显示警告消息吗?
- python - 曼哈顿距离的距离变换 - Python / NumPy / SciPy
- vue.js - 导航有交钥匙解决方案吗?
- apache-spark - 火花写镶木地板非常慢
- c++ - 我可以用 null 初始化一个迭代器吗?如果不是,为什么?