我想用n个字母列出所有可能的单词,其中第一个字母可以是a1或a2,第二个可以是b1,b2或b3,第三个可以是c1或c2,...这里'简单n = 2的示例输入输出,每个字母有2个替代:
我尝试通过首先使用前2个字母创建所有可能的单词来递归地执行此操作,所以像这样:
aws s3 cp
然而,对于每个字母的大n或多个替代,这变得非常慢。什么是解决这个问题的更有效方法?
由于
答案 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
['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))