gpt4 book ai didi

Python - 获取组合的索引

转载 作者:行者123 更新时间:2023-11-28 17:14:55 24 4
gpt4 key购买 nike

例如,我需要生成从“a”到“]]]]]]”的组合,为此我使用了这个运行良好的 python 脚本。

import itertools

DATA_ALPHA_NUM =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&-
()@=+;/!%$\\'\",.<>*^{}#~_[]"
b = 10

for i in range(1,int(b)+1):
for e in itertools.combinations(DATA_ALPHA_NUM,i): print(''.join(e))

但现在我需要做相反的事情,例如:如果我给新脚本“1”,它将输出“a”,如果我给 90,它将输出“]”等。

我写了几个脚本,它们在少于 737191 个组合的情况下运行良好,但之后就不太好了。

编辑:有人写了类似的东西然后删除了它几乎是完美的..

alphaNumList = list(DATA_ALPHA_NUM)
alphaNumList.insert(0, "")

result = ["".join(item) for item in
itertools.islice(itertools.product(alphaNumList, repeat=6), 0,1)]

最佳答案

您不需要组合。事实上,你想要“aa”。但是对于组合,因为您永远不会选择两次相同的项目,所以不会发生这种情况。

所以这里有一个带有“累积乘积”的正确版本,确实,就像 Raymond 对组合所做的那样,我必须数 (90, 90 + 90 **2, 90 + 90 **2 + 90 **3, .. .) 以找到与我正在跟踪的组合相对应的良好功率。

请注意它没有优化,因为我正在对产品进行切片......只是为了检索一个值!

import itertools

alphaNumList = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&-()@=+;/!%$\\'\",.<>*^{}#~_[]")

cumulative = [len(alphaNumList)]
for i in range(1, 10):
cumulative.append(len(alphaNumList) ** (i+1) + cumulative[i - 1])


def getCombiFromIndex(combiNumber):
p = 0
while cumulative[p] < combiNumber:
p += 1 # WARNING : not robust to combi greater than (10,90) in my case :)
rest = combiNumber - 1 - (cumulative[p - 1] if p > 0 else 0)
return "".join([item for item in itertools.islice(itertools.product(alphaNumList, repeat=p + 1), rest, rest + 1)][0])


print(getCombiFromIndex(1)) # "a"
print(getCombiFromIndex(90)) # "]"
print(getCombiFromIndex(91)) # "aa"
print(getCombiFromIndex(800064)) # "ah+1"

更新:基于相同的概念,我添加了检索 2 个索引之间列表的方法,但在这种情况下,更好地使用 slice :)

def getCombiListBetween(fromNumber, toNumber):
combiList = []
if fromNumber < toNumber:
pF, pT = 0, 0
while cumulative[pF] < fromNumber:
pF += 1
while cumulative[pT] < toNumber:
pT += 1
start = fromNumber - 1 - (cumulative[pF - 1] if pF > 0 else 0)
end = toNumber - 1
for p in range(pF, pT + 1):
combiList += ["".join(item) for item in itertools.islice(itertools.product(alphaNumList, repeat=p + 1), start, min(cumulative[p], end) + 1)]
start = 0
end -= cumulative[p]
else:
combiList.append(getCombiFromIndex(fromNumber))
return combiList

print(getCombiListBetween(8189, 8191)) # ['][', ']]', 'aaa']

关于Python - 获取组合的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com