生成所有可能的三字母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])