python中字母表的枚举器

时间:2012-03-27 15:18:43

标签: python list enumeration

鉴于


alphabet = ['a','b','c',...,'z']
我希望python枚举一个单词的每个组合(从1个字母单词开始,例如1000个字母单词)。例如(如果我想要长度为10的单词的每个组合),它应该像这样开始:

[a,b,c,d...,z,aa,ab,ac,ad,ae,...,aaa,aba,aca,ada,...,aab,aac,aad,....,zzzzzzzzzz]

如何实现?

4 个答案:

答案 0 :(得分:3)

itertools.product正是您所寻找的:

import itertools

max_length = 10
result = (''.join(word) for word in 
             itertools.chain.from_iterable(
                 itertools.product(alphabet, repeat = i)
                     for i in range(1, max_length + 1)))

你需要使用一个生成器,因为有太多可能的单词(即使长度为10),因此可以将它们全部存储在台式计算机的内存中。

答案 1 :(得分:1)

尝试使用product中的itertools

from itertools import product

result = []
for i in range(1, 5):
  alphabets = [alphabet] * i
  for x in product(*alphabets):
    result.append(''.join(x))

是的,这适用于我的机器。但是不要用1000运行它。

答案 2 :(得分:1)

注意到您关心订单后更新

你必须使用itertools.product()并迭代它:

result = []
for r in range(1, 4):
    result.extend(''.join(i) for i in product(alphabet, repeat=r))

简单检查:

>>> 'dog' in result
True
>>> 'god' in result
True

或没有生成器表达式:

for r in range(1, 4):
    for i in product(alphabet, repeat=r):
        result.append(''.join(i))

让我们谈谈疯狂

这里的每个解决方案都无法处理长话,因为有太多可能的组合(这是任何人的错)。我不在乎这个实现只能处理比“epicalyx”更短的单词,而agf的答案最多可以处理10个字母。

这种方法只应用于小词。

  

“我希望python枚举每个组合(从1个字母开头,例如 1000 字母的单词)” - OP是否说过。

他的理智思想中的任何人都不应该试图以这种方式列举所有这些可能性,并且每个认为那或那个试图推动这个限制的人都是疯狂的,应该真正看看{{3} }。

答案 3 :(得分:1)

这里要考虑的两件事是

  1. itertools.product从范围1到n,其中n是最大字大小,可以得到所需的结果。
  2. 你应该使用发电机,否则你很快会耗尽所有的记忆
  3. 这是一个这样的实现

    >>> def foo(somelist,n):
        return (''.join(x) for i in xrange(1,n+1) for x in itertools.product(somelist, repeat=i))
    

    您可以按以下方式调用生成器foo

    >>> for i in foo(string.ascii_lowercase,10):
        print i,