itertools.islice()
方法允许我从给定值开始生成charset中的字符组合。使用Generate(1, 7, "abcde", "bdca")
运行我的方法将运行得很好。
然而,当整数处于最大值时,'值(大于2147483647
)我得到错误:
ValueError:islice()的索引必须为None或整数:0< = x< = sys.maxsize。
如何让itertools.islice
获取较大的起始值?
我确实尝试将sys.maxsize设置为'一个大数字'并明确地将startValue
转换为整数; sys.maxsize = (len(charset) ** maxVal)
,但islice()
忽略了这一点。
这是我到目前为止提出的代码:
def checkValue(charset, word):
pos = len(charset)
value = 0
for i,c in enumerate(reversed(word)):
value+= (pos**i) * charset.index(c)
return value
def Generate(minVal, maxVal, charset, startFrom):
startValue = int(checkValue(charset, startFrom))
print(startValue)
allCombos = itertools.product(charset, repeat=len(startFrom))
combos = itertools.islice(allCombos, int(startValue), None) # error is here with 'startValue'
# generate from combo to end of length
for num, attempt in enumerate(combos, start=startValue):
generated = "".join(attempt)
print(num, generated)
# have to make new instance or skips a chunk for each length
for length in range(minVal + 1, maxVal + 1):
to_attempt = itertools.product(charset, repeat=length)
for attempt in to_attempt:
generated = "".join(attempt)
print(generated)
Generate(1, 15, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", "ADHkjdWCE")
感谢您的帮助。
答案 0 :(得分:2)
这是islice
的实现细节,如果不手动重新实现,则无法直接解决。
如果你转向64位版本的Python,sys.maxsize
将从2**31 - 1
跳转到2**63 - 1
,这是如此之大,以至于实际上耗尽了长时间不会发生的切片。任何人类合理的时间。
注意:这里的设计是个坏主意。 islice
不是魔术;它仍然必须耗尽(丢弃结果)才能到达startValue
。这样做20多亿次需要很长时间。我建议找一种方法直接在以后开始迭代,而不是从头开始并丢弃20亿个项目。