python - 按顺序生成所有可能的子串

标签 python substring permutation n-gram

我正在寻找一个库或一种有效的方法来在 Python 中实现以下内容

Input: 
"He was hungry"

Desired Output:
[["He","was","hungry"]
["He was","hungry"]
["He","was hungry"]
["He was hungry"]]

最佳答案

这是一种递归方法:对于包含 N 个单词的输入,计算前 N-1 个单词的可能连接,然后选择是将最后一个单词作为其自己的元素附加还是将其与最右边的元素连接。

def iter_joinings(items):
    if len(items) == 0:
        return
    elif len(items) == 1:
        yield items
    else:
        right = items[-1]
        for left_a in iter_joinings(items[:-1]):
            left_b = left_a.copy()
            left_a.append(right)
            yield left_a
            left_b[-1] = left_b[-1] + " " + right
            yield left_b

s = "He was hungry"
for result in iter_joinings(s.split()):
    print(result)

结果:

['He', 'was', 'hungry']
['He', 'was hungry']
['He was', 'hungry']
['He was hungry']

这是一个迭代版本,以防万一您有 999 个元素的输入并且不想达到 Python 的最大递归深度:

import itertools

def iter_joinings(items):
    for decisions in itertools.product((False, True), repeat=len(items)-1):
        result = [items[0]]
        for idx, should_append in enumerate(decisions, 1):
            if should_append:
                result.append(items[idx])
            else:
                result[-1] = result[-1] + " " + items[idx]
        yield result

s = "He was hungry"
for result in iter_joinings(s.split()):
    print(result)

...尽管如此庞大的输入在任何一种情况下都需要大约 10^300 字节码指令来执行,所以这不太可能成为实际问题。

关于python - 按顺序生成所有可能的子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57906801/

相关文章:

string - Julia:如何获得给定字符串 s 的随机排列?

python - 在 python 中的列表中构建列表

Python - 使用 for 循环而不是 Split 方法或任何其他方式提取子字符串

c# - 如何使用子字符串删除字符串结尾(文件名)?

Javascript 子字符串和 indexOf 在 IE9 中不起作用

arrays - 包含特定索引 'i' 的子数组的数量是多少?

r - 查找包含字符序列的字符串,而不管 r 中的顺序

python - Pillow 安装错误 : command 'gcc' failed with exit status 1

python - GIS/GEOTiff/GDAL/Python 如何从像素获取坐标

python - 如何使用 python 请求上传文件?