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()
我正在尝试快速创建字符串的每个可能版本的列表。我并不是真的指具体的子词 - 例如从字符串 "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()