Pythonic发生器的起始值超过可能的字母组合

时间:2011-04-02 23:56:34

标签: python persistence generator counter

我试图(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,但没有看到光......

2 个答案:

答案 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']

所以这应该让它从随机点更容易拾取