我试图(1)迭代所有可能的字母组合和(2)记住我离开的地方。
E.g. a,b, c, d, ... z, aa, ab, ac, ad, ..., zz, aaa, ...
第一部分正在运行,使用以下代码:
def xselections(items, n):
if n==0: yield []
else:
for i in xrange(len(items)):
for ss in xselections(items, n-1):
yield [items[i]]+ss
for i in [1, 2, 3]:
for combo in xselections(ascii_lowercase, i):
print ''.join(combo)
但是我无法在其他地方启动迭代,即总是a,b,c,......是否有一种干净的方式来扩展生成器以便像
那样xselections(items=ascii_lowercase, n=3, last=[a,c,y])
-> acz, ada, adb, adc, ...
可能吗?我在看itertools
,但没有看到光......
答案 0 :(得分:2)
这应该做的工作:
import itertools
letters = [ chr(l) for l in range(ord('a'), ord('z')+1) ]
def combinations(skip_to=None):
combinations = ( itertools.combinations_with_replacement(letters, k) for k in range(1, len(letters)+1) )
flat = itertools.chain.from_iterable( combinations )
return flat if skip_to is None else itertools.dropwhile( lambda x: x != skip_to, flat )
itertools
模块确实很神奇: - )
答案 1 :(得分:2)
我知道它不是你想要的,但是我写了一个函数,就像你指定的那样从int到字母序列一一对应
def intToLetterSeq(x):
a = list()
while(x >= 0):
a += [x % 26]
x /= 26
x -= 1
return [chr(97+i) for i in a[::-1]]
>>> intToLetterSeq(0)
['a']
>>> intToLetterSeq(25)
['z']
>>> intToLetterSeq(37)
['a', 'l']
>>> intToLetterSeq(11*26**3+7*26**2+2*26+20)
['k', 'g', 'b', 'u']
所以这应该让它从随机点更容易拾取