Python 中字符串的子词

Subwords of a string in Python

我正在尝试快速创建字符串的每个可能版本的列表。我并不是真的指具体的子词 - 例如从字符串 "ABC",我想得到:

['C', 'B', 'BC', 'A', 'AB', 'ABC']
(没有 "AC" 这是一个子词)

同样适用于 "123":
我想得到 ['3', '2', '23', '1', '12', '123'] 而不是 ['3', '2', '23', '1', '13', '12', '123']

这是一个简单的基于循环和切片的生成器函数:

def subs(s):
    for i in range(len(s)):
        for j in range(i+1, len(s)+1):
            yield s[i:j]

>>> list(subs("ABC"))
['A', 'AB', 'ABC', 'B', 'BC', 'C']

对于 ABC 你可以得到 ['C', 'B', 'BC', 'A', 'AB', 'ABC', 'AC'] 然后使用 remove() 从你的列表中删除子词。 E.i:

abc_list = ['C', 'B', 'BC', 'A', 'AB', 'ABC', 'AC']
abc_list.remove('AC')

Output: ['C', 'B', 'BC', 'A', 'AB', 'ABC']

问题缺乏上下文,无法为您提供完整答案。您所有的字符串都包含 3 个或更多字符吗?你如何定义你不需要的东西? 如果所有字符串的长度都是3个字符,那么你可以这样使用:

def subwording(word: str):
    subword = word[0]+word[2]
    return subword

然后您可以从列表中删除 subword

扩展子字符串而不是对每个子字符串进行新鲜切片可能会更快:

def subs(s):
    while s:
        t = ''
        for c in s:
            t += c
            yield t
        s = s[1:]

s = "z" * 5000 的基准测试结果:

8.4 seconds  subs_slice
1.5 seconds  subs_extend

基准代码(Try it online!):

from timeit import timeit
from collections import deque

def subs_slice(s):
    for i in range(len(s)):
        for j in range(i+1, len(s)+1):
            yield s[i:j]

def subs_extend(s):
    while s:
        t = ''
        for c in s:
            t += c
            yield t
        s = s[1:]

funcs = subs_slice, subs_extend

for func in funcs:
    print(list(func('ABCD')))

s = "z" * 5000
for _ in range(3):
    for func in funcs:
        t = timeit(lambda: deque(func(s), 0), number=1)
        print(t, func.__name__)
    print()