给出起始字符串的Python强力组合

时间:2015-06-17 23:25:10

标签: python python-3.x brute-force

我正在尝试用Python做一个强力字符串生成器,而itertools.combinations_with_replacement似乎就是这样做的。

gen = itertools.combinations_with_replacement('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',12)
for combination in gen:
  check(''.join(combination))

假设用户运行该程序几个小时并达到字符串aaaeabdouzIU

是否有任何方法给出一个字符串,他们离开时从该点开始进行组合?

因此,如果我传递字符串“acc”,则应该开始尝试“acd”,“ace”,...

itertools.combinations_with_replacement本身不提供此功能,是否有人可以实现这一目标?

2 个答案:

答案 0 :(得分:4)

itertools man page获取原始代码,复制combination_with_replacement代码的代码,但用从您输入的单词开始的新索引替换第7行。

inputStr='acc'
indices=[pool.index(l) for l in inputStr]

然后从手册页运行其余代码。

编辑:对于完整的运行功能:

def combinations_with_replacement(iterable, r, startWord=None):
    # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC                                                                                   
    pool = tuple(iterable)
    n = len(pool)
    if not n and r:
        return
    if startWord is None:
        indices = [0] * r
    else:
        assert len(startWord) == r
        indices = [pool.index(l) for l in startWord]
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != n - 1:
                break
        else:
            return
        indices[i:] = [indices[i] + 1] * (r - i)
        yield tuple(pool[i] for i in indices)

答案 1 :(得分:1)

如果您知道,如果您知道如何生成下一个,那么很容易。

一种方法可以是定义从组合到自然数的映射,以及从自然数到组合的逆映射。例如,您可以使用Base 62 conversion

中的base62_encode / base62_decode
def next_comb(s):
    return base62_encode(1+base62_decode(s))

和一个生成器,在给定起点的情况下生成所有组合:

def generate_all(start='a'):
    while True:
        yield start
        start = next_comb(start)

用法:

for comb in generate_all():
    print(comb)

或者,从起点恢复计算:

for comb in generate_all(starting_point):
    print(comb)