按顺序生成字母数字字符串

时间:2011-08-20 18:12:40

标签: python string algorithm

我正在尝试创建一个循环来生成和打印字符串,如下所示:

  1. 仅限字母数字字符:
  2. 0-9在A-Z之前,在a-z之前,
  3. 长度最多为4个字符。
  4. 所以,它会打印出来:

    1. 来自0-z的所有字符串
    2. 然后从00-zz
    3. 然后来自000-zzz
    4. 然后从0000-zzzz
    5. 然后停止。

5 个答案:

答案 0 :(得分:23)

from string import digits, ascii_uppercase, ascii_lowercase
from itertools import product

chars = digits + ascii_uppercase + ascii_lowercase

for n in range(1, 4 + 1):
    for comb in product(chars, repeat=n):
        print ''.join(comb)

这首先是一个包含所有数字,大写字母和小写字母的字符串。

然后,对于1-4的每个长度,它会打印这些数字和字母的每种可能组合。

请记住,这是很多组合 - 62 ^ 4 + 62 ^ 3 + 62 ^ 2 + 62。

答案 1 :(得分:0)

我不喜欢在我之前使用product给出的答案,因为在python文档中查看它的实现,它似乎在开始产生结果之前将整个事物扩展到内存中的列表。

这对你的情况非常不利,因为正如agf自己所说,这里的排列数量很大(超过一百万)。对于这种情况,创建了yield语句 - 因此可以动态生成大型列表而不是跨越内存(我也不喜欢浪费的range xrange完全适用)。

我会选择这样的解决方案:

def generate(chars, length, prefix = None):
    if length < 1:
        return
    if not prefix:
        prefix = ''
    for char in chars:
        permutation = prefix + char
        if length == 1:
            yield permutation
        else:
            for sub_permutation in generate(chars, length - 1, prefix = permutation):
                yield sub_permutation

这样,所有跨越内存的都是递归堆栈&#34; n&#34;深,哪里&#34; n&#34;是排列的长度(在这种情况下为4),每次只返回一个元素。

chars是可供选择的字符集,长度为4,使用与产品非常相似,只是在运行时它不会跨越内存中的整个列表。

答案 2 :(得分:0)

我今天编了这个。它完全符合您的要求和更多。它也是可扩展的

def lastCase (lst):
    for i in range(0, len(lst)):
        if ( lst[i] != '_' ):
            return False
    return True


l = [''] * 4 #change size here if needed. I used 4
l[0] = '0'
index = 0

while ( not lastCase(l) ):

    if ( ord(l[index]) > ord('_') ):
        l[index] = '0'
        index += 1
        while( l[index] == '_' ):
            l[index] = '0'
            index += 1
        if (l[index] == ''):
            l[index] = '0'

    #print or process generated string
    print(''.join(l))

    l[index] = chr(ord(l[index]) +1)

    if ( ord(l[index]) > ord('9') and ord(l[index]) < ord('A') ):
        l[index] = 'A'
    elif ( ord(l[index]) > ord('Z') and ord(l[index]) < ord('_')  ): 
        l[index] = '_'

    index = 0

print (''.join(l))

答案 3 :(得分:0)

from string import digits, ascii_uppercase, ascii_lowercase
from itertools import product
chars = digits + ascii_uppercase + ascii_lowercase

def give_me_next(lst):
        lst = lst[::-1]
        change_next = False
        change = True
        n = 0
        for x in lst:
                if change_next == True:
                        change_next = False
                        pos = chars.find(x)
                        try:
                                a =  chars[pos+1]
                                lst = list(lst)
                                lst[n] = a
                                lst = "".join(lst)
                                x = a
                        except:
                                lst = list(lst)
                                lst[n] = '0'
                                lst = "".join(lst)
                                change_next = True
                                x = '0'

                pos = chars.find(x)
                try:
                        a =  chars[pos+1]
                        if change == True:
                                lst = list(lst)
                                lst[n] = a
                                lst = "".join(lst)
                                change = False
                except:
                        lst = list(lst)
                        lst[n] = '0'
                        lst = "".join(lst)
                        change_next = True

                n = n + 1

        lst = lst[::-1]
        return lst

a=  give_me_next('zzzzz')
while True:
        a =  give_me_next(a)
        print a

答案 4 :(得分:0)

这对我来说似乎是最简单的解决方案:

from string import digits, ascii_uppercase, ascii_lowercase

chars = digits + ascii_uppercase + ascii_lowercase
all_str = [''.join([a]) for a in chars] \
        + [''.join([a,b]) for a in chars for b in chars] \
        + [''.join([a,b,c]) for a in chars for b in chars for c in chars] \
        + [''.join([a,b,c,d]) for a in chars for b in chars for c in chars for d in chars]

print(all_str)
print("Number of strings:", len(all_str))

Example for strings with maximum 2 characters.

当然,可能有一种方法可以概括每个字符串的最大字符数,但是由于您特别需要最多4个字符的字符串,因此可以。