Python 用n个字母列出所有可能的单词
我想用n个字母列出所有可能的单词,其中第一个字母可以是a1或a2,第二个可以是b1、b2或b3,第三个可以是c1或c2。。。下面是一个简单的输入-输出示例,n=2,每个字母有两个备选方案:Python 用n个字母列出所有可能的单词,python,Python,我想用n个字母列出所有可能的单词,其中第一个字母可以是a1或a2,第二个可以是b1、b2或b3,第三个可以是c1或c2。。。下面是一个简单的输入-输出示例,n=2,每个字母有两个备选方案: 输入=[“a”、“b”]、[“c”、“d”]] 输出=[“ac”、“ad”、“bc”、“bd”] 我尝试递归地创建所有可能的单词,首先使用前两个字母,如下所示: def go(l): if len(l) > 2: head = go(l[0:2]) tail
- 输入=[“a”、“b”]、[“c”、“d”]]
- 输出=[“ac”、“ad”、“bc”、“bd”]
def go(l):
if len(l) > 2:
head = go(l[0:2])
tail = l[2:]
tail.insert(0, head)
go(tail)
elif len(l) == 2:
res = []
for i in l[0]:
for j in l[1]:
res.append(i+j)
return res
elif len(l) == 1:
return l
else:
return None
然而,对于大n或每个字母有许多备选方案,这会变得非常缓慢。解决这个问题的更有效方法是什么
谢谢您可以使用内置itertools模块中的来实现这一点,如下所示
>>> from itertools import permutations
>>> [''.join(word) for word in permutations('abc', 2)]
['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
您可以使用来自内置itertools模块的
>>> from itertools import permutations
>>> [''.join(word) for word in permutations('abc', 2)]
['ab', 'ac', 'ba', 'bc', 'ca', 'cb']
使用给定字母表生成一定长度的所有字符串:
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
下一步: 下一步:
下一步: 使用给定字母表生成一定长度的所有字符串: 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
下一步: 下一步:
下一步: 我想你只是想在这里: 或者,如果你想把它们组合成文字:
>>> [''.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)
),则需要指数级的时间。但至少它有常数空间而不是指数空间(它一次生成一个产品,而不是所有产品的巨大列表),并且通过一个合适的常数因子,它将比您之前的速度更快,而且它更简单,更难出错。我想您只需要这里:
或者,如果你想把它们组合成文字:
>>> [''.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)
),则需要指数级的时间。但至少它有常数空间,而不是指数空间(它一次生成一个产品,而不是所有产品的巨大列表),并且通过一个合适的常数因子,它将比您之前的速度更快,而且更简单,更难出错。您指的是字典中的单词吗,或者只是字母的任意排列?你需要将结果存储在列表中,还是只打印它们就可以了?你是指字典中的单词,还是只是字母的任意排列?你需要将结果存储在列表中,还是只打印它们就可以了?我认为这并不能回答问题。它特别指出,第一个字母必须从一组特定的字母中选择,第二个字母必须从第二组中选择,第三个字母必须从第三组中选择,等等。仔细检查输出,这正是如此。@JohnGordon第一个字母是从组'ab'
中选择的,第二个来自组'c'
,第三个来自组'de'
@JohnGordon是的,vidstige的答案确实有这个问题,如果C Performance的答案没有一个更大的问题,那么它就会有这个问题。@niefpaarschoenen我不知道你要挑选多少人,以及你打算如何分发他们,但是是的,用random.sample
或如果是random.random()>q
或产品之前的任何产品
将大大加快速度,即使它可能(取决于您想做什么)更加复杂。我认为这并不能回答问题。它特别指出,第一个字母必须从一组特定的字母中选择,第二个字母必须从第二组中选择,第三个字母必须从第三组中选择,等等。仔细检查输出,这正是如此。@JohnGordon第一个字母是从组'ab'
中选择的,第二个来自组'c'
,第三个来自组'de'
@JohnGordon是的,vidstige的答案确实有这个问题,如果C Performance的答案没有一个更大的问题,那么它就会有这个问题。@niefpaarschoenen我不知道你要挑选多少人,以及你打算如何分发他们,但是是的,用random.sample
或如果是random.random()>q
或产品之前的任何产品
都将大大加快速度,即使它可能(取决于您想做什么)更加复杂。我认为这不是OP想要的。他们希望从a1或a2中选择第一个字符;第二个来自b1、b2或b3;第三个来自c1或c2;等等,是的,你是对的。@abarnert的答案是正确的我不认为这是OP想要的。他们希望从a1或a2中选择第一个字符;第二个来自b1、b2或b3;第三个来自c1或c2;等等,是的,你是对的。@abarnert的答案是OP想要生成所有产品的正确答案。随机生成它们不是一个好方法。此外,每个字母使用相同的集合,而不是第一个字母使用一个集合,第二个字母使用不同的集合,等等。OP希望生成所有产品。随机生成它们不是一个好方法。此外,每个字母使用相同的集合,而不是第一个字母使用一个集合,第二个字母使用不同的集合,等等。
>>> [''.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']