[英]How to find the longest repeated adjacent values in a string and put parentheses around them
我試圖遍歷一個字符串並圍繞最長的重復相鄰值標記 () 。 例子:
“344556(7777)5412”
max_run = "0"
J = "34455677775412"
for x in range(len(J)-1):
if J[x] == J[x+1]
if J[x:x+2] > max_run:
print( "(", end = "")
max_run = J[x:x+2]
print( ")", end = "")
標准庫包itertools
中的groupby
方法按順序對術語進行分組,然后取最大值。
import itertools as it
ref_string = "34455677775412"
max_squence = ''.join(max((list(j) for _, j in it.groupby(ref_string)), key=len))
print(ref_string.replace(max_squence, f'({max_squence})'))
程序主體的另一種實現(感謝 Kelly Bundy):首先將每個組加入一個字符串,然后按最長字符串過濾
max_squence = max((''.join(j) for _, j in it.groupby(ref_string)), key=len)
喜歡 itertools,但由於groupby
已經有一個(很好的)解決方案,這里有一個帶有經典循環的解決方案:
J = "34455677775412"
run = []
prev = None
for pos, char in enumerate(J):
if char == prev:
run[-1][0] += 1
else:
run.append([1, pos])
prev = char
print(run)
a,b = max(run, key=lambda x: x[0])
J[:b]+'('+J[b:b+a]+')'+J[b+a:]
輸出: '344556(7777)5412'
如果你不能使用任何標准庫方法,比如groupby
,這里有一個普通的 python 實現,它做同樣的事情:
i = 0
max_start, max_end = 0, 0
J = "34455677775412"
# find the longest repeating sequence
while i < len(J):
j = i
while j < len(J) and J[j] == J[i]:
j += 1
max_start, max_end = max([(max_start, max_end), (i, j)], key=lambda e: e[1] - e[0])
i = j
print(max_start, max_end, J[max_start:max_end])
J = J[:max_start] + "(" + J[max_start:max_end] + ")" + J[max_end:] # insert the parentheses
print(J)
您還可以使用 Python 正則表達式庫re
來實現與@cards 類似的解決方案
import re
J = "34455677775412"
pattern = r'(.)\1+'
longest_sequence = max([match.group() for match in re.finditer(pattern, J)])
print(J.replace(longest_sequence, f'({longest_sequence})'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.