В порядке комбинаций задается строка

#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 строки.

Вам нужно найти другой способ сделать это.