#python #combinations
#python #комбинации
Вопрос:
Я пытаюсь создать все возможные комбинации по порядку слогов слова.
Например, у меня есть слово overflowing
, и у меня есть список его слогов ['o', 'ver', 'flow', 'ing']
. Я хотел бы, чтобы на выходе были показаны все возможные комбинации объединения слогов для создания слова : [('o', 'ver', 'flow', 'ing'), ('o', 'verflow', 'ing'), ('o', 'verflowing'), ('overflowing'), ('over', 'flow', 'ing'), ...]
.
Вот моя попытка:
syllable_list = ['o', 'ver', 'flow', 'ing']
list_length = len(syllable_list)
for x in range(0, list_length):
for y in range(0, list_length):
if syllable_list[y:x 1]:
before = ""
middle = ""
after = ""
if syllable_list[0:y]:
before = ["".join(syllable_list[0:y])]
if syllable_list[x 1:]:
after = ["".join(syllable_list[x 1:])]
middle = ["".join(syllable_list[y:x 1])]
print(before, middle, after)
Вывод:
['o'] ['verflowing']
['over'] ['flowing']
['o'] ['ver'] ['flowing']
['overflow'] ['ing']
['o'] ['verflow'] ['ing']
['over'] ['flow'] ['ing']
['overflowing']
['o'] ['verflowing']
['over'] ['flowing']
['overflow'] ['ing']
Все комбинации есть, с некоторыми дубликатами, и я упускаю ['o', 'ver', 'flow', 'ing']
случай. Что я делаю не так? Есть ли библиотека, которая уже обрабатывает это, поэтому мне не нужно воссоздавать колесо?
Комментарии:
1. Практически говоря, какова ценность чего-то подобного
('o', 'verflowing')
?2. Вы изучали
itertools.permutations
функцию? Это может быть что-то, что укажет вам правильное направление: docs.python.org/3/library/itertools.html#itertools.permutations
Ответ №1:
Вы можете использовать рекурсивный генератор, который объединяет любые два последовательных элемента для следующего уровня рекурсии:
>>> def generate(parts, start=0):
... yield parts
... for i in range(start, len(parts)-1):
... yield from generate([*parts[:i], parts[i] parts[i 1], *parts[i 2:]], start=i)
...
>>> from pprint import pprint
>>> pprint(list(generate(['o', 'ver', 'flow', 'ing'])))
[['o', 'ver', 'flow', 'ing'],
['over', 'flow', 'ing'],
['overflow', 'ing'],
['overflowing'],
['over', 'flowing'],
['o', 'verflow', 'ing'],
['o', 'verflowing'],
['o', 'ver', 'flowing']]
Ответ №2:
Поскольку вы определили только 3 переменные (After, middle и before), вы не можете получить выходные данные с более чем 3 строками.
Ваш код всегда будет соединять как минимум 2 строки.
Вам нужно найти другой способ сделать это.