从给定长度的字符列表创建所有可能的单词,以给定字符开头

时间:2015-02-12 06:57:59

标签: python python-2.7

我需要从一个以给定字符开头的给定长度的字符列表中创建所有可能的单词列表。

例如:

char_list = a,b,c
min_len = 2
max_len = 3

更新

start with = c

所以功能应该返回这样的东西:

ca, cb, cc, cab, cac, cba, cbc...

我如何在python中执行此操作?非常感谢您的帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

使用标准库

中的itertools.product类创建产品对象
import itertools

[''.join(i) for i in itertools.product(char_list, repeat= 2) if i[0].startswith('c')]
['ca', 'cb', 'cc']

[''.join(i) for i in itertools.product(char_list, repeat=3) if i[0].startswith('c')]
['caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']

要为数字范围生成单词列表,请使用generator function

def generate_word(chars_list, my_char, min_len, max_len):
    for i in range(min_len, max_len+1):
        for j in itertools.product(chars_list, repeat=i):
            if j[0].startswith(my_char):
                yield ''.join(j)

for word in generate_word(char_list, 'c', 2, 4):   
    print(word)

<强>输出

ca
cb
cc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
caaa
caab
caac
caba
cabb
cabc
caca
cacb
cacc
cbaa
cbab
....

答案 1 :(得分:2)

这是一个使用与Eithos代码类似的技术的程序。它会创建一个生成器,以便您可以根据需要一次获取一个单词。生成器代码适用于Python 2.6及更高版本,但您需要更改Python 3的print

#!/usr/bin/env python

import itertools

def word_generator(chars, start_with, min_len, max_len):
    for i in range(min_len - 1, max_len):
        for s in itertools.product(chars, repeat=i):
            yield start_with + ''.join(s)    

for word in word_generator('abc', 'c', 2, 4):
    print word

<强>输出

ca
cb
cc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
caaa
caab
caac
caba
cabb
cabc
caca
cacb
cacc
cbaa
cbab
cbac
cbba
cbbb
cbbc
cbca
cbcb
cbcc
ccaa
ccab
ccac
ccba
ccbb
ccbc
ccca
cccb
cccc

如果您希望列表中的单词而不是一次中的单词,则可以执行以下操作:

word_list = list(word_generator('abc', 'c', 2, 4))

答案 2 :(得分:1)

我认为这将完全符合您的要求:

当我认为itertools.combinations_with_replacement会做到这一点时,我犯了一个错误。迈克尔的帖子(最初使用permutations)让我反思我的选择,所以我开始重新编写代码。我实际上让它工作,但我很快意识到它不适合这项工作。然后我意识到你真正需要的是itertools.product

from itertools import product

minLen = 4
maxLen = 8
sChar = 'a'
print [sChar + ''.join(i) for x in range(minLen-1, maxLen) 
    for i in product(['a','b','c'], repeat=x)]

但如果您尝试使用较小的输入进行测试:

minLen = 2
maxLen = 3

你得到:

['aa', 'ab', 'ac', 'aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc']

我们也可以使用c(根据更新的帖子):

minLen = 2
maxLen = 3
sChar = 'c'

['ca', 'cb', 'cc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']