按照给定字符串的顺序组合



我正在尝试创建单词音节的所有可能的有序组合。

例如,我有单词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']的情况。我做错了什么?有没有一个库已经处理了这个问题,这样我就不必重新创建轮子了?

您可以使用递归生成器,它将任意两个连续元素组合在一起,用于下一级递归:

>>> 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']]

由于只定义了3个变量(After、middle和before(,因此无法获得超过3个字符串的输出。

您的代码将始终连接至少2个字符串。

你需要找到另一种方法来做到这一点。

最新更新