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



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

'0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM. '

这是100个字母长,例如:

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001'

我目前正在使用这个代码:

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

这段代码有效,但我需要能够在某个索引处返回组合,然而itertools.product不支持索引,将产品转换为列表会产生MemoryError,并且在产品中迭代直到达到某个值对于超过十亿的值来说需要太长时间。

感谢的帮助

如果有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

相反,如果你想知道特定字符串位于哪个组合索引,你可以通过组合每个位置的字符索引(数字(来计算base64值:

s = "Python.Person says Hello World" # leading zeroes are implied
i = 0
for c in s:
i = i*len(chars)+chars.index(c)
print(i) # 1083232247617211325080159061900470944719547986644358934

您现在更接近于理解base64编码,它与应用于编码超过4个字符(即3个二进制字节-->4个字母数字字符(的24位数字或其任何变体的情况相同

最新更新