【问题标题】:Create all the possible words from a list of character for a given length that starts with a given character从以给定字符开头的给定长度的字符列表中创建所有可能的单词
【发布时间】:2015-02-12 16:22:52
【问题描述】:

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

例如:

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

更新:

start with = c

所以函数应该返回如下内容:

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

我将如何在 python 中执行此操作?您的帮助将不胜感激。谢谢。

【问题讨论】:

  • 不过,这些都不是以“c”开头的。你能澄清你想要的输出吗?
  • @Eithos 对不起,我的错。 :)
  • 'aaa' 是可接受的输出吗?
  • @Eithos 是的。我忘了在问题中提到它。
  • 请看看我最近的编辑;)。它是否给出了您期望的输出?

标签: python python-2.7


【解决方案1】:

这是一个使用与 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】:

您使用标准库中的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
....

【讨论】:

  • 谢谢。但是我需要创建从 min_len 到 max_len 的单词列表,就像 min_len 为 4 并且 max_len 为 8 一样,然后创建长度为 4 到 8 的单词列表。我希望我很清楚。
  • @Aamu 这正是你想要的
  • 我收到此错误:[''.join(i) for i in itertools.combinations_with_replacement(char_list, 2)] NameError: name 'itertools' is not defined。以及如何设置字符开始?
  • @Aamu 你需要导入itertools模块
  • @Michael9 如果您注意到,您的输出都没有像cba 这样的东西。那是因为您的结果是按排序顺序排列的,所以它总是会在 b 之前是 a,在 c 之前。
【解决方案3】:

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

当我认为itertools.combinations_with_replacement 可以解决问题时,我犯了一个错误。 Michael 的帖子(最初使用 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']

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2015-10-07
    • 2022-07-07
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多