我有一个由25个整数组成的集合,范围从0到24,我的应用程序需要 Select 其中的5个(没有重复值,任何值都不能多次 Select ),从而获得像这样的组合[15, 7, 12, 3, 22].重要的是要考虑前面的组合被认为等于[7, 22, 12, 15, 3],顺序并不重要,只有值才重要.

通过应用二项系数(25 Select 5),我们可以发现有53.130种可能的组合.我想将所有可能的组合编码为一个整数,以便将从0到53129的所有值链接到一个组合.

推荐答案

使用more_itertools.nth_combination可以计算第n个组合,而无需计算之前的所有组合:

# pip install more-itertools
from more_itertools import nth_combination

nth_combination(range(25), 5, 0)
# (0, 1, 2, 3, 4)

nth_combination(range(25), 5, 42)
# (0, 1, 2, 5, 7)

nth_combination(range(25), 5, 53129)
# (20, 21, 22, 23, 24)

你可以把上面的内容和functools.partial/cache结合起来,让事情变得更有趣:

from functools import partial, cache

encode = partial(nth_combination, range(25), 5)
# or with a cache
# encode = cache(partial(nth_combination, range(25), 5))

encode(0)
# (0, 1, 2, 3, 4)

encode(42)
# (0, 1, 2, 5, 7)

encode(53129)
# (20, 21, 22, 23, 24)

efficiency

nth_combination的优点是,对于大范围,不需要计算所有的n-1个组合来访问第n个组合.此外,它不需要存储所有组合,从而提高了CPU和内存的效率.与cache结合使用时,如果多次请求相同的代码,则避免两次重新计算相同的值,从而在内存和CPU之间进行了折衷.

但是,如果最终必须访问all个值,则预计算所有组合as show by @ti7将更加直接和高效,但需要从头开始计算和存储所有值:

from itertools import combinations

encode = list(combinations(range(25), 5))

encode[0]
# (0, 1, 2, 3, 4)

encode[42]
# (0, 1, 2, 5, 7)

encode[53129]
# (20, 21, 22, 23, 24)

Python相关问答推荐

螺旋桨图上意外颠倒的次y轴

OdooElectron 商务产品详情页面中add_qty参数动态更新

来自ARIMA结果的模型方程

在两极中实施频率编码

如果我已经使用了time,如何要求Python在12秒后执行另一个操作.sleep

具有2D功能的Python十六进制图

如何根据情况丢弃大Pandas 的前n行,使大Pandas 的其余部分完好无损

Python中MongoDB的BSON时间戳

仅从风格中获取 colored颜色 循环

使用plotnine和Python构建地块

在Python中处理大量CSV文件中的数据

如果值不存在,列表理解返回列表

pandas滚动和窗口中有效观察的最大数量

无法定位元素错误404

我们可以为Flask模型中的id字段主键设置默认uuid吗

Python,Fitting into a System of Equations

Python—从np.array中 Select 复杂的列子集

Django RawSQL注释字段

在pandas/python中计数嵌套类别

重置PD帧中的值