我正在尝试用给定长度的给定字符(单词)列出单词列表。每个单词都是给定字符(单词)和[a..z] [0..9](无大写)的组合
E.g:长度= 5,给定单词:out(给定单词的长度< max length)
该函数应该返回一个列表,其中包含:outaa,outba,...,out9a,out0a,...,outab,outbb,...,out9b,out0b,...,aouta,bouta,.. .aaout,baout ......
意味着我们用[a..z] [0..9]填充剩余的字符,同时移动给定单词的位置。
我还在考虑一种方法,但还没有提出任何想法。有人介意给我一个帮助吗?
非常感谢
答案 0 :(得分:3)
使用itertools.product()
生成剩余字符,然后使用collections.deque
循环显示字位置以生成所有排列:
from collections import deque
from itertools import product
from string import ascii_lowercase, digits
def generate_words(start, length, _chars=ascii_lowercase + digits):
remainder = length - len(start)
if remainder < 1:
yield start
return
for letters in product(_chars, repeat=remainder):
combo = deque(letters + (start,))
for _ in range(remainder + 1):
yield ''.join(combo)
combo.rotate()
这是一个生成器,循环输出:
>>> for word in generate_words('out', 5):
... print word
...
aaout
outaa
aouta
about
outab
bouta
acout
outac
couta
adout
outad
douta
aeout
outae
eouta
afout
outaf
# etc.
或在生成器上调用list()
并准备好存储大量单词,如果len(start)
和length
之间的差异开始超过3(另外4个字符会产生8398080)组合,5个字符是362797056组合;公式是(36**remainder)*(remainder + 1)
)。