我有一个由25个整数组成的集合,范围从0到24,我的应用程序需要 Select 其中的5个(没有重复值,任何值都不能多次 Select ),从而获得像这样的组合[15, 7, 12, 3, 22].重要的是要考虑前面的组合被认为等于[7, 22, 12, 15, 3],顺序并不重要,只有值才重要.
通过应用二项系数(25 Select 5),我们可以发现有53.130种可能的组合.我想将所有可能的组合编码为一个整数,以便将从0到53129的所有值链接到一个组合.
我有一个由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)
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)