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

Jan 25, 2016 14:06


Занимаюсь, по мере сил, дальнейшим изучением  языка 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

# удаляем лишние варианты, длина которых менее количества слов

i = len(variants)
while i >=0:
i = i-1
if len(variants[i]) < word_count:
zz = variants.pop(i)

print variants
print len(variants)

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

for comb in variants:
if len(comb) < word_count:
variants.remove(comb)

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

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

программирование, код, python

Previous post Next post
Up