列出给定字符的单词列表

时间:2014-02-15 10:53:04

标签: python algorithm word combinations

我正在尝试用给定长度的给定字符(单词)列出单词列表。每个单词都是给定字符(单词)和[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]填充剩余的字符,同时移动给定单词的位置。

我还在考虑一种方法,但还没有提出任何想法。有人介意给我一个帮助吗?

非常感谢

1 个答案:

答案 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))。