列出所有可能包含n个字母的单词

时间:2018-05-14 23:00:30

标签: python

我想用n个字母列出所有可能的单词,其中第一个字母可以是a1或a2,第二个可以是b1,b2或b3,第三个可以是c1或c2,...这里'简单n = 2的示例输入输出,每个字母有2个替代:

  • 输入= [[" a"," b"],[" c"," d"]]
  • 输出= [" ac"," ad"," bc"," bd"]

我尝试通过首先使用前2个字母创建所有可能的单词来递归地执行此操作,所以像这样:

aws s3 cp

然而,对于每个字母的大n或多个替代,这变得非常慢。什么是解决这个问题的更有效方法?

由于

3 个答案:

答案 0 :(得分:5)

我想你只想在这里itertools.product

>>> from itertools import product
>>> lst = ['ab', 'c', 'de']
>>> words = product(*lst)
>>> list(words)
[('a', 'c', 'd'), ('a', 'c', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e')]`

或者,如果你想让他们加入单词:

>>> [''.join(word) for word in product(*lst)]
['acd', 'ace', 'bcd', 'bce']

或者,以你的例子:

>>> lst = [["a","b"],["c","d"]]
>>> [''.join(word) for word in product(*lst)]
['ac', 'ad', 'bc', 'bd']

当然,对于非常大的n或非常大的字母集(大小m),此变慢。如果要生成指数级大的输出集(O(m**n)),则需要指数时间。但至少它具有恒定而非指数空间(它一次生成一个产品,而不是所有产品的巨大列表),并且会比你通过一个体面的常数因子的速度更快,并且它和#39;更简单,更容易出错。

答案 1 :(得分:2)

您可以使用内置itertools模块中的permutations来实现此目的,就像这样

>>> from itertools import permutations
>>> [''.join(word) for word in permutations('abc', 2)]
['ab', 'ac', 'ba', 'bc', 'ca', 'cb']

答案 2 :(得分:-1)

使用给定的字母生成一些长度的所有字符串:

test.py:

def generate_random_list(alphabet, length):
    if length == 0: return []
    c = [[a] for a in alphabet[:]]
    if length == 1: return c
    c = [[x,y] for x in alphabet for y in alphabet]
    if length == 2: return c
    for l in range(2, length):
        c = [[x]+y for x in alphabet for y in c]
    return c

if __name__ == "__main__":
    for p in generate_random_list(['h','i'],2):
        print p

$ python2 test.py

['h', 'h']
['h', 'i']
['i', 'h']
['i', 'i']

下一步:

def generate_random_list(alphabet, length):
    c = []
    for i in range(length):
        c = [[x]+y for x in alphabet for y in c or [[]]]
    return c

if __name__ == "__main__":
    for p in generate_random_list(['h','i'],2):
        print p

下一步:

import itertools
if __name__ == "__main__":
    chars = "hi"
    count = 2
    for item in itertools.product(chars, repeat=count):
        print("".join(item))
import itertools
print([''.join(x) for x in itertools.product('hi',repeat=2)])

下一步:

from itertools import product
#from string import ascii_letters, digits

#for i in product(ascii_letters + digits, repeat=2):
for i in product("hi",repeat=2):
    print(''.join(i))