Python - 長度為 K 的連續字元
連續字元是指連續出現的字元。長度為 K 的連續字元意味著同一個字元連續出現了 K 次。在本文中,我們將採用幾種方法來實現它。我們將首先使用迴圈語句進行暴力搜尋。接下來,我們將使用正則表示式、滑動視窗技術等方法執行相同的操作。滑動視窗是一種更好、更最佳化的查詢長度為 K 的連續字元的方法。NumPy 庫也為我們提供了採用類似技術的方法。
使用暴力方法
暴力法是一種簡單的演算法,我們可以不考慮最佳化的情況下想到它。對於我們的例子,我們可以使用以下方法
初始化一個空列表。
迭代字串。由於我們需要找到 K 個連續的字元,迭代 n-k+1 次就足夠了。
接下來,在每次迭代中取出包含接下來的 K 個字元的子字串。
從中建立一個集合並找到長度。如果長度為 1,則序列中的所有字元都相同。將結果新增到列表中。
示例
在下面的示例中,我們定義了一個名為 find_consecutive_characters 的函式。它將字串和值 K 作為引數。接下來,我們定義了一個名為 result 的空列表。我們迭代了 n-k+1 次。在每次迭代中,我們都使用了字串索引方法來獲取字串的長度為 K 的子字串。我們使用 set 函式訪問子字串的唯一字元。我們使用 len 方法查詢子字串的長度,並檢查它是否等於 1。如果是,則將子字串新增到列表中。
def find_consecutive_characters(string, k): n = len(string) result = [] for i in range(n - k + 1): substring = string[i:i+k] if len(set(substring)) == 1: result.append(substring) return result test_string="aaabcedfffghikkk" k=3 print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")
輸出
Consecutive characters with length 3 are: ['aaa', 'fff', 'kkk']
使用 re 庫
Python 中的 re 庫是一個強大的工具,它支援正則表示式。正則表示式(通常縮寫為 regex 或 regexp)是根據特定規則匹配和操作文字字串的模式。該庫允許我們在字串中搜索模式,提取字串的特定部分,替換字串等。雖然我們也可以構建類似的邏輯,但 re 庫為這個問題提供了最佳方法。
示例
在下面的程式碼中,匯入 re 庫後,我們建立了一個名為 find_consecutive_characters 的函式,它接收字串的名稱和長度 K。接下來,我們將模式定義為一個字串並將其儲存在 pattern 變數中。我們使用 re 庫的“findall”方法查詢具有該模式的所有子字串。它返回一個包含元組的列表。每個元組包含兩個組成部分,第一個是完全匹配,第二個是被捕獲的元素。我們使用列表推導式將元組的第一個元素新增到列表的元素中。我們從函式返回結果。我們使用值為 K 的字串進行測試。我們呼叫該函式並列印結果。
import re def find_consecutive_characters(string, k): pattern = r"((.)\2{%d})" % (k - 1) result = re.findall(pattern, string) result = [match[0] for match in result] return result test_string="abdffghttpplihdf" k=2 print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")
輸出
Consecutive characters with length 2 are: ['ff', 'tt', 'pp']
使用滑動視窗
滑動視窗是一種流行的程式設計技術,我們可以用它來搜尋陣列或列表等物件序列中的模式。你應該透過滑動來滑動一個固定長度的視窗穿過資料。當處理子陣列、子字串等時,該方法尤其重要。對於我們的問題,我們想要查詢具有相同字元和長度 K 的子序列。因此,滑動視窗可能是一個不錯的選擇。
示例
在下面的程式碼中,我們建立了 find_consecutive_characters 方法,這是一個非空函式,它返回長度為 K 的連續字元列表。在這個函式中,我們首先定義了一個名為 result 的空列表,然後使用前 K 個元素 a 和 set 方法將其轉換為集合。如果集合的長度為 1,我們將子字串新增到已初始化的列表中。然後,我們對其餘子字串實現了類似的演算法。我們返回列表。
def find_consecutive_characters(string, k): n = len(string) result = [] window = string[:k] if len(set(window)) == 1: result.append(window) for i in range(k, n): window = window[1:] + string[i] if len(set(window)) == 1: result.append(window) return result test_string="xxxxangduuuu" k=4 print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")
輸出
Consecutive characters with length 4 are: ['xxxx', 'uuuu']
使用 NumPy 庫
NumPy 是 Python 中用於數值計算的流行庫。該庫允許程式設計師以 NumPy 陣列的形式執行操作。這些陣列的實現效率很高,使它們成為程式設計師的流行選擇。NumPy 庫有一個函式可以有效地處理滑動視窗。因此,我們可以利用內建方法來生成長度為 K 的連續字元。
示例
在下面的程式碼中,我們匯入了 NumPy 庫。我們建立了函式 find_consecutive_characters,它將字串和長度 K 作為引數。在函式中,我們使用“frombuffer”方法將字串轉換為 NumPy 陣列。我們使用 sliding_window_view 方法在字元中實現滑動視窗。接下來,我們使用了列表推導式技術,該技術僅在視窗中唯一字元的計數為 1 時才附加元素。
import numpy as np def find_consecutive_characters(string, k): arr = np.frombuffer(string.encode(), dtype=np.uint8) windows = np.lib.stride_tricks.sliding_window_view(arr, k) result = [window.tobytes().decode() for window in windows if np.unique(window).size == 1] return result test_string="xxxxangduuuu" k=4 print(f"Consecutive characters with length {k} are: {find_consecutive_characters(test_string, k)}")
輸出
Consecutive characters with length 4 are: ['xxxx', 'uuuu']
結論
在本文中,我們瞭解瞭如何查詢字串的長度為 K 的連續字元。我們可以為此定義自己的邏輯。否則,Python 有幾個庫和包可以幫助我們做到這一點。我們首先看到了暴力方法。暴力方法很容易理解,但效率可能不高——像“re”這樣的庫允許我們實現更簡單的演算法。我們還可以使用滑動視窗方法,這是一種流行的程式設計技術。