我正在尝试创建一个循环来生成和打印字符串,如下所示:
所以,它会打印出来:
然后停止。
答案 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个字符的字符串,因此可以。