Перечислитель для алфавита в питоне - PullRequest
4 голосов
/ 27 марта 2012

Дано:
alphabet = ['a','b','c',...,'z']
я хочу, чтобы python перечислял каждую комбинацию (начиная с 1 буквенного слова, например, до 1000 буквенных слов) слова. Например (если я хочу каждую комбинацию слова длиной 10), оно должно начинаться так:

[a,b,c,d...,z,aa,ab,ac,ad,ae,...,aaa,aba,aca,ada,...,aab,aac,aad,....,zzzzzzzzzz]

Как этого добиться?

Ответы [ 4 ]

3 голосов
/ 27 марта 2012

itertools.product - это то, что вы ищете:

import itertools

max_length = 10
result = (''.join(word) for word in 
             itertools.chain.from_iterable(
                 itertools.product(alphabet, repeat = i)
                     for i in range(1, max_length + 1)))

Вы должны использовать генератор для этого, потому что просто слишком много возможных слов (даже в длине 10) чтобы можно было хранить их все в памяти на настольном компьютере.

1 голос
/ 27 марта 2012

Здесь нужно учесть две вещи

  1. itertools.product в диапазоне от 1 до n, где n - максимальный размер слова, который даст желаемый результат.
  2. Вы должны использовать генератор, иначе вы скоро исчерпаете всю память

Вот одна из таких реализаций

>>> def foo(somelist,n):
    return (''.join(x) for i in xrange(1,n+1) for x in itertools.product(somelist, repeat=i))

Вы можете вызвать генератор foo следующим образом

>>> for i in foo(string.ascii_lowercase,10):
    print i,
1 голос
/ 27 марта 2012

Обновление после уведомления о том, что вы заботитесь о заказе

Вы должны использовать itertools.product() и перебирать его:

result = []
for r in range(1, 4):
    result.extend(''.join(i) for i in product(alphabet, repeat=r))

Простая проверка:

>>> 'dog' in result
True
>>> 'god' in result
True

Или без выражения генератора:

for r in range(1, 4):
    for i in product(alphabet, repeat=r):
        result.append(''.join(i))

Давай поговорим о безумии

Каждое решение здесь не может обрабатывать длинные слова, потому что слишком много возможных комбинаций (это чья-то вина). Мне все равно, если эта реализация может обрабатывать только слова короче "epicalyx", в то время как ответ agf может обрабатывать до 10 букв.

Этот подход следует использовать только для маленьких слов.

«Я хочу, чтобы python перечислял каждую комбинацию (начиная с 1 буквенного слова, например, 1000 буквенных слов)» - это, как сказал OP.

Никто в его здравом уме не должен даже пытаться перечислить все эти возможности таким образом, и каждый, кто думает, что тот или другой пытается раздвинуть этот предел, просто сумасшедший и действительно должен взглянуть на ChessMaster замечательные комментарии .

1 голос
/ 27 марта 2012

Попробуйте использовать product из itertools:

from itertools import product

result = []
for i in range(1, 5):
  alphabets = [alphabet] * i
  for x in product(*alphabets):
    result.append(''.join(x))

Да, это работает на моей машине.Но не запускайте его с 1000.

...