2011-04-02 41 views
1

我试图(1)遍历所有可能的字母组合并(2)记住我离开的位置。Pythonic发生器在可能的字母组合上的起始值

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) 

但我没能获得迭代开始在其他地方,即总是,B,C,...是有没有干净的方式来扩大发生器,使像

xselections(items=ascii_lowercase, n=3, last=[a,c,y]) 
-> acz, ada, adb, adc, ... 

是可能的吗?我在看itertools,但没有看到光...

+1

你知道生成器,但使用'xrange(len(...))'遍历事物吗? – delnan 2011-04-03 00:01:49

+0

你想通过记住你离开的地方来达到什么目的?提取一些值然后提取更多或仅跳过一些第一个值? – pajton 2011-04-03 00:04:37

+0

@pajton如果需要,我想跳过第一个值。 – mhermans 2011-04-03 00:47:53

回答

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模块是魔术的确:-)

2

我知道它并不完全符合你要找的,但我写的像你指定

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

所以,应该让一个函数从int到字母序列那是一一一对应从随机点轻松取出它更容易