如何从itertools排列中调用索引值而不将其转换为列表?

问题描述 投票:-1回答:1

我需要创建这些字符的所有组合:

'0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM. '

长度为100个字母,例如:

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001'

我目前正在使用此代码:

import itertools
babel = itertools.product(k_c, repeat = 100)

此代码有效,但是我需要能够在某个索引处返回该组合,但是itertools.product不支持索引,将产品转换为列表会产生MemoryError,并反复遍历该产品,直到达到某个确定值为止价值超过十亿的时间太长。

感谢您的帮助

python indexing permutation itertools
1个回答
0
投票

具有64个字符和100个字母,将有64 ^ 100个组合。对于第一个字母的每个值,其余字母将有64 ^ 99个组合,然后是64 ^ 98、64 ^ 97,依此类推。

这意味着您的第N个组合可以在基数64中表示为N,其中每个“数字”代表字符串中字母的索引。

一个简单的解决方案是通过逐步确定每个位置的索引并使用N的其余部分获取其余字符串来递归地构建字符串:

chars = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM. '

def comboNumber(n,size=100):
    if size == 1: return chars[n]
    return comboNumber(n//len(chars),size-1)+chars[n%len(chars)]

输出:

c = comboNumber(123456789000000000000000000000000000000000000123456789)
print(c)
# 000000000000000000000000000000000000000000000000000000000000000000000059.90jDxZuy6drpQdWATyZ8007dNJs


c = comboNumber(1083232247617211325080159061900470944719547986644358934)
print(c)
# 0000000000000000000000000000000000000000000000000000000000000000000000Python.Person says Hello World
© www.soinside.com 2019 - 2024. All rights reserved.