Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用n个字母列出所有可能的单词_Python - Fatal编程技术网

Python 用n个字母列出所有可能的单词

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

我想用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 = 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']