python:获取给定长度的所有可能字母表

python:获取给定长度的所有可能字母表,python,Python,上面没有给出“zzzz”或“zzz” 我需要下面这样的东西,它可以提供: a、 b,c,d。。 aa,ab,ac。。 aaa,AAAB 但是do_perm()硬编码为循环四次,我不想这样做 def permutations(iterable, r=None): # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC # permutations(range(3)) --> 012 021 10

上面没有给出“zzzz”或“zzz”
我需要下面这样的东西,它可以提供: a、 b,c,d。。 aa,ab,ac。。 aaa,AAAB

但是do_perm()硬编码为循环四次,我不想这样做

def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = list(range(n))
    cycles = list(range(n, n-r, -1))
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

got = permutations(getAllTheLetters(),4)
cnt = 0
for i in got:
    cnt += 1
    print ''.join(i)

print cnt
你可以像这样简单地使用

def getAllTheLetters(begin='a', end='z'):
    beginNum = ord(begin)
    endNum = ord(end)
    yield ''
    for number in xrange(beginNum, endNum+1):
        yield chr(number)

def do_perm(l):
    s = set()
    for a in getAllTheLetters():
        for b in getAllTheLetters():
            for c in getAllTheLetters():
                for d in getAllTheLetters():
                    to_add = "%s%s%s%s" % (a,b,c,d)
                    if to_add != "":
                        s.add(to_add)

    return s

got = do_perm(1)
cnt = 0
for i in sorted(got):
    cnt +=1
    print i
print cnt
from itertools import product

def get_strings(letters, max_length):
    for i in range(1, max_length + 1):
        for value in product(letters, repeat=i):
            yield "".join(value)
['a', 'b', 'aa', 'ab', 'ba', 'bb']
当你这样调用它的时候

def getAllTheLetters(begin='a', end='z'):
    beginNum = ord(begin)
    endNum = ord(end)
    yield ''
    for number in xrange(beginNum, endNum+1):
        yield chr(number)

def do_perm(l):
    s = set()
    for a in getAllTheLetters():
        for b in getAllTheLetters():
            for c in getAllTheLetters():
                for d in getAllTheLetters():
                    to_add = "%s%s%s%s" % (a,b,c,d)
                    if to_add != "":
                        s.add(to_add)

    return s

got = do_perm(1)
cnt = 0
for i in sorted(got):
    cnt +=1
    print i
print cnt
from itertools import product

def get_strings(letters, max_length):
    for i in range(1, max_length + 1):
        for value in product(letters, repeat=i):
            yield "".join(value)
['a', 'b', 'aa', 'ab', 'ba', 'bb']
你会得到

print(list(get_strings("ab", 2)))
如果要获取从
a
z
的所有值,可以调用
get\u strings
,如下所示

def getAllTheLetters(begin='a', end='z'):
    beginNum = ord(begin)
    endNum = ord(end)
    yield ''
    for number in xrange(beginNum, endNum+1):
        yield chr(number)

def do_perm(l):
    s = set()
    for a in getAllTheLetters():
        for b in getAllTheLetters():
            for c in getAllTheLetters():
                for d in getAllTheLetters():
                    to_add = "%s%s%s%s" % (a,b,c,d)
                    if to_add != "":
                        s.add(to_add)

    return s

got = do_perm(1)
cnt = 0
for i in sorted(got):
    cnt +=1
    print i
print cnt
from itertools import product

def get_strings(letters, max_length):
    for i in range(1, max_length + 1):
        for value in product(letters, repeat=i):
            yield "".join(value)
['a', 'b', 'aa', 'ab', 'ba', 'bb']
注意:这将创建大量字符串,因此您的计算机可能会停止响应。如果您只想遍历字符串,请使用
for
循环
get_strings
,如下所示,不要创建列表

from string import ascii_lowercase
print(list(get_strings(ascii_lowercase, 4)))

您需要的是
itertools.compositions\u和\u replacement
,而不是
itertools.permutations