Python. Подбор всех возможных вариантов

Занимаюсь, по мере сил, дальнейшим изучением  языка Python для целей, понятно, порабощения мира.

На выходных усердно тупил над простенькой, казалось бы, проблемкой:
надо было для набора слов (предложения) написать скрипт, составляющий все множество вариантов с тем условием, что у каждого слова есть некоторое количество омонимов. Частично задача упрощена тем, что каждое слово имеет свою позицию, т.е. кол-во вариантов исчисляется не факториалом, а просто перемножением количеств составных частей.

В итоге скрипт получился, но кажется мне он несколько тяжеловесным.
Может, кто натолкнет на мысль, как сделать прощще?

#список, содержащий вложенные списки омонимов
words = [[['x1'],['x2']],[['y1'],['y2'],['y3'],['y4']],[['z1'],['z2'],['z3']]]
word_count = len(words)

#создаем список, который будет содержать варианты
variants = []
#добавляем в список варианты омонимов первого слова:
for i in range (0, len(words[0])):
    variants.append(words[0][i])
#перебираем варианты, складывая уже имеющиеся комбинации в списке вариантов с последующими словами
x = 1
while x != word_count:
    for i in range(0,len(variants)):
        for j in range (0, len(words[x])):
            variants.append(variants[i]+words[x][j])
    x = x+1
print variants[1]

# удаляем лишние варианты, длина которых менее количества слов
i = len(variants)
while i >=0:
    i = i-1
    if len(variants[i]) < word_count:
        zz = variants.pop(i)
        print 'del'
print variants
print len(variants)

Тупняк был в чем? Первоначально лишние варианты я пытался убрать так:

for comb in variants:

    if len(comb) < word_count:

        variants.remove(comb)

и сильно негодовал, почему эта зараза пропускала  варианты, подлежащие удалению. Потом, конечно, не без помощи анторнетов, допер, что когда элемент из списка удалялся, то длина его изменялась, а итератор этого не учитывал и перескакивал через одно значение.

З.Ы.  Кстати, если кому интересно — онлайн интерпретатор для Pytnon`а (и не только).  Забавно с точки зрения самообучения  — можно наглядно смотреть как работает код построчно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Капча: * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.