Начальное значение для генератора Pythonic по возможным буквенным комбинациям - PullRequest
1 голос
/ 03 апреля 2011

Я пытаюсь (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 ]

2 голосов
/ 03 апреля 2011

Я знаю, что это не совсем то, что вы ищете, но я написал функцию, которая соответствует однозначному соответствию от 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']

Так что это должно сделать выборнемного проще, чем раньше

2 голосов
/ 03 апреля 2011

Это должно сделать работу:

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 действительно волшебен: -)

...