2 回答

TA貢獻(xiàn)1799條經(jīng)驗 獲得超8個贊
通過循環(huán)使用:
for i in sq:
您正在遍歷.sq
相反,如果您希望變量i遍歷 的可能索引,sq您通常會遍歷range(len(sq)),以便從0到獲取值len(sq) - 1。
for i in range(len(sq)):
但是,在這種情況下,您想要分配給i循環(huán)內(nèi)部:
i += len(STR)
如果您正在循環(huán),這將不會產(chǎn)生預(yù)期的效果,range(...)因為在下一次迭代中它將被分配給來自 的下一個值range,忽略添加的增量。通常,不應(yīng)在循環(huán)內(nèi)分配給循環(huán)變量。
因此,它可能最容易通過循環(huán)實現(xiàn),并且您顯式while設(shè)置所需的值(在重新啟動循環(huán)之前進(jìn)行初始化),然后您可以在循環(huán)內(nèi)進(jìn)行任何其他賦值。ii=0i+=1
STR = "ell"
sq = "well, well, hello world"
counter = 0
i = 0
while i < len(sq):
while sq[i:i+len(STR)] == STR: # re use of while here, see comments
counter += 1
i += len(STR)
i += 1
print(counter) # prints 3
(您也許可以保存len(sq)并保存len(STR)在其他變量中以保存重復(fù)評估它們。)

TA貢獻(xiàn)1772條經(jīng)驗 獲得超8個贊
此解決方案不使用 afor因此增量可以在不匹配時增加一個,在匹配時增加字符串長度。任何不匹配記錄到目前為止看到的最大計數(shù)并重置計數(shù)。
def count_max(string,key):
if len(key) > len(string):
return 0
last = len(string) - len(key)
i = 0
count = 0
maximum = 0
while i <= last:
if string[i:i+len(key)] == key:
count += 1
i += len(key)
else:
maximum = max(maximum,count)
count = 0
i += 1
return max(maximum,count)
key = 'abc'
strings = 'ab','abc','ababcabc','abcdefabcabc','abcabcdefabc'
for string in strings:
print(count_max(string,key))
輸出:
0
1
2
2
2
這里還有一個可能更快的版本。對于短字符串,它并不快,但如果字符串很長,它會快得多,因為正則表達(dá)式會比 Python 循環(huán)更快地找到匹配項。
def count_max2(string,key):
return max([len(match) // len(key)
for match in re.findall(rf'(?:{re.escape(key)})+',string)]
,default=0)
怎么運行的:
re.escape
是一個確保字符按key
字面意義而不是正則表達(dá)式語法的函數(shù)。例如,允許搜索+
,而不是被視為“一個或多個”匹配項。rf''
是原始f 字符串(格式字符串)的語法。建議對正則表達(dá)式使用“raw”,因為表達(dá)式的某些語法會與其他 Python 語法混淆。f-strings 允許使用大括號將變量和函數(shù)插入到字符串中{}
。re.findall
查找字符串中的所有連續(xù)匹配項。[f(x) for x in iterable]
是一個列表推導(dǎo)式,獲取從 iterable 返回的列表,并計算列表中每個項目的函數(shù)。在這種情況下,如果用匹配的長度除以鍵的長度來得到鍵的出現(xiàn)次數(shù)。max(iterable,default=0)
返回 iterable 的最大值,如果 iterable 為空(無匹配項)則返回 0。
添加回答
舉報