[英]Counting longest occurrence of repeated sequence in Python
計算字符串中某個字符的最長連續重復次數的最簡單方法是什么? 例如,以下字符串中“b”的最長連續重復:
my_str = "abcdefgfaabbbffbbbbbbfgbb"
將是6,因為其他連續重復更短(分別為3和2)。我如何在Python中執行此操作?
一個正則表達式的例子怎么樣:
import re
my_str = "abcdefgfaabbbffbbbbbbfgbb"
len(max(re.compile("(b+b)*").findall(my_str))) #changed the regex from (b+b) to (b+b)*
# max([len(i) for i in re.compile("(b+b)").findall(my_str)]) also works
編輯,我和對話
x=timeit.Timer(stmt='import itertools;my_str = "abcdefgfaabbbffbbbbbbfgbb";max(len(list(y)) for (c,y) in itertools.groupby(my_str) if c=="b")')
x.timeit()
22.759046077728271
x=timeit.Timer(stmt='import re;my_str = "abcdefgfaabbbffbbbbbbfgbb";len(max(re.compile("(b+b)").findall(my_str)))')
x.timeit()
8.4770550727844238
這是一個單行:
max(len(list(y)) for (c,y) in itertools.groupby(my_str) if c=='b')
說明:
itertools.groupby
將返回連續相同字符組,以及該組中所有項目的迭代器。 對於每個這樣的迭代器, len(list(y))
將給出組中的項目數。 取最大值(對於給定的字符)將給出所需的結果。
這是我真正無聊,低效,直接的計數方法(interjay's更好)。 注意,我在這個沒有解釋器的小文本字段中寫了這個,所以我沒有測試它,我可能犯了一個非常愚蠢的錯誤,證明讀取沒有捕獲。
my_str = "abcdefgfaabbbffbbbbbbfgbb"
last_char = ""
current_seq_len = 0
max_seq_len = 0
for c in mystr:
if c == last_char:
current_seq_len += 1
if current_seq_len > max_seq_len:
max_seq_len = current_seq_len
else:
current_seq_len = 1
last_char = c
print(max_seq_len)
使用行程編碼:
import numpy as NP
signal = NP.array([4,5,6,7,3,4,3,5,5,5,5,3,4,2,8,9,0,1,2,8,8,8,0,9,1,3])
px, = NP.where(NP.ediff1d(signal) != 0)
px = NP.r_[(0, px+1, [len(signal)])]
# collect the run-lengths for each unique item in the signal
rx = [ (m, n, signal[m]) for (m, n) in zip(px[:-1], px[1:]) if (n - m) > 1 ]
# get longest:
rx2 = [ (b-a, c) for (a, b, c) in rx ]
rx2.sort(reverse=True)
# returns: [(4, 5), (3, 8)], ie, '5' occurs 4 times consecutively, '8' occurs 3 times consecutively
這是我的代碼,效率不高但似乎有效:
def LongCons(mystring):
dictionary = {}
CurrentCount = 0
latestchar = ''
for i in mystring:
if i == latestchar:
CurrentCount += 1
if dictionary.has_key(i):
if CurrentCount > dictionary[i]:
dictionary[i]=CurrentCount
else:
CurrentCount = 1
dictionary.update({i: CurrentCount})
latestchar = i
k = max(dictionary, key=dictionary.get)
print(k, dictionary[k])
return
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.