我正在嘗試以快速的方式創建字串的每個可能版本的串列。我的意思并不是特別的子詞 - 例如從字串"ABC",我想得到:
['C', 'B', 'BC', 'A', 'AB', 'ABC']
(沒有作為子詞的“AC”)
這同樣適用于“123”:
我想要得到[ '3', '2', '23', '1', '12', '123']代替[ '3', '2', '23' , '1', '13', '12', '123']
uj5u.com熱心網友回復:
這是一個簡單的回圈和基于切片的生成器函式:
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']
uj5u.com熱心網友回復:
擴展子字串可能會更快,而不是對每個子字串進行新切片:
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
基準代碼(在線試用!):
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()
uj5u.com熱心網友回復:
因為ABC您可以['C', 'B', 'BC', 'A', 'AB', 'ABC', 'AC']使用getremove()從串列中洗掉子詞。艾:
abc_list = ['C', 'B', 'BC', 'A', 'AB', 'ABC', 'AC']
abc_list.remove('AC')
輸出:['C', 'B', 'BC', 'A', 'AB', 'ABC']
該問題缺乏背景關系,無法為您提供完整答案。您的所有字串都包含 3 個字符或更多字符嗎?你如何定義你不需要的東西?如果所有字串的長度都是 3 個字符,那么您可以使用以下命令:
def subwording(word: str):
subword = word[0] word[2]
return subword
然后您可以subword從串列中洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/402254.html
下一篇:子串數
