生成所有可能的三字母string的最佳方法是什么?

我生成所有可能的三个字母关键字, eg aaa, aab, aac.... zzy, zzz下面是我的代码:

 alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] keywords = [] for alpha1 in alphabets: for alpha2 in alphabets: for alpha3 in alphabets: keywords.append(alpha1+alpha2+alpha3) 

这个function是否能够以更加圆滑和高效的方式实现?

 keywords = itertools.product(alphabets, repeat = 3) 

请参阅itertools.product的文档 。 如果你需要一个string列表,只需使用

 keywords = [''.join(i) for i in itertools.product(alphabets, repeat = 3)] 

alphabets也不一定是一个列表,它可以只是一个string,例如:

 from itertools import product from string import ascii_lowercase keywords = [''.join(i) for i in product(ascii_lowercase, repeat = 3)] 

将工作,如果你只是想小写的ASCII字母 。

你也可以使用map来代替列表理解(这是地图比LC还要快的情况之一)

 >>> from itertools import product >>> from string import ascii_lowercase >>> keywords = map(''.join, product(ascii_lowercase, repeat=3)) 

列表理解的这种变化也比使用''.join更快

 >>> keywords = [a+b+c for a,b,c in product(ascii_lowercase, repeat=3)] 
 from itertools import combinations_with_replacement alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] for (a,b,c) in combinations_with_replacement(alphabets, 3): print a+b+c 

您也可以通过简单的计算,在没有任何外部模块的情况下执
PermutationIterator是你正在寻找的。

 def permutation_atindex(_int, _set, length): """ Return the permutation at index '_int' for itemgetter '_set' with length 'length'. """ items = [] strLength = len(_set) index = _int % strLength items.append(_set[index]) for n in xrange(1,length, 1): _int //= strLength index = _int % strLength items.append(_set[index]) return items class PermutationIterator: """ A class that can iterate over possible permuations of the given 'iterable' and 'length' argument. """ def __init__(self, iterable, length): self.length = length self.current = 0 self.max = len(iterable) ** length self.iterable = iterable def __iter__(self): return self def __next__(self): if self.current >= self.max: raise StopIteration try: return permutation_atindex(self.current, self.iterable, self.length) finally: self.current += 1 

给它一个可迭代对象和一个整数作为输出长度。

 from string import ascii_lowercase for e in PermutationIterator(ascii_lowercase, 3): print "".join(e) 

这将从“aaa”开始,以“zzz”结束。

 chars = range(ord('a'), ord('z')+1); print [chr(a) + chr(b) +chr(c) for a in chars for b in chars for c in chars] 
 print([a+b+c for a in alphabets for b in alphabets for c in alphabets])