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”這樣的庫允許我們實現更簡單的演算法。我們還可以使用滑動視窗方法,這是一種流行的程式設計技術。

更新於:2023年7月18日

1K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告