Python程式提取網格匹配字串


模式識別是一個重要的程式設計概念。它允許我們檢索滿足特定條件或匹配特定序列的特定資料。這一原理在包括語言影像處理在內的各個領域都很有幫助。字串匹配幫助我們從大量資料中提取有意義的資訊。

在本文中,我們將討論一個類似的概念,即從給定的字串列表中提取網格匹配字串。網格匹配側重於提取長度相等的“相似”字串,讓我們詳細討論這個問題。

理解問題

主要概念是提取遵循特定模式的相似字串。網格字串包含缺失的字元,並且應該提取與網格隱藏模式匹配的字串。讓我們藉助示例來理解這一點。

輸入輸出場景

Input:
lis1 = ["Suresh", "Ramesh", "Ravi", "Raghav"]
mesh = "___e_h"

網格包含字母“e”和“h”以及一些形成模式的缺失字元。我們必須從與網格模式匹配的列表中提取字串。

Output: ['Suresh', 'Ramesh']

顯然,“Suresh”和“Ramesh”與網格模式匹配。現在我們已經理解了問題陳述,讓我們討論一些解決方案。

使用迭代以及Zip()

在傳遞字串列表和網格模式後,我們將建立一個空列表以儲存提取的字串。我們將使用“for”迴圈迭代每個字串,並在迴圈內建立一個條件,該條件檢查當前“string”(單詞)的長度是否等於網格的長度。

這使我們能夠選擇與網格匹配的相關字串。該條件還檢查網格中的字元是否為“下劃線”或它是否與單詞中相應的字元匹配。

使用這兩個條件,我們將提取與網格模式匹配的單詞。如果兩個字串及其字元都滿足條件,則將使用zip()函式迭代並配對來自“mesh”的字元和“words”的字元。此函式允許在兩個模式之間進行成對比較。

示例

以下是提取網格匹配字串的示例:

lis1 = ["Suresh", "Ramesh", "Ravi", "Raghav"]
mesh = "___e_h"
lis2 = []
print(f"The original list is: {lis1}")

for words in lis1:
   if (len(words) == len(mesh)) and all((letter1 == "_") or (letter1 == letter2)
      for letter1, letter2 in zip(mesh, words)):
         lis2.append(words)

print(f"The new list is: {lis2}")

輸出

The original list is: ['Suresh', 'Ramesh', 'Ravi', 'Raghav']
The new list is: ['Suresh', 'Ramesh']

使用列表推導式

在這種方法中,我們將使用列表推導式的技術來生成一個細緻且緊湊的程式碼。迭代的多行概念可以總結為幾行程式碼。

這種緊湊的表示增強了程式的可讀性。我們將使用相同的邏輯來建立條件並分離符合條件的值。將“for”和“if”迴圈應用於列表中。每個字元都透過zip()函式進行比較和配對。

示例

以下是一個示例:

lis1 = ["Suresh", "Ramesh", "Ravi", "Raghav"]
mesh = "___e_h"
print(f"The original list is:{lis1}")

lis2 = [words for words in lis1 if (len(words) == len(mesh)) and all((letter1 == "_") or (letter1 == letter2)
           for letter1, letter2 in zip(mesh, words))]

print(f"The new list is: {lis2}")

輸出

The original list is:['Suresh', 'Ramesh', 'Ravi', 'Raghav']
The new list is: ['Suresh', 'Ramesh']

使用Filter() + Lambda()函式

Filter函式可用於根據某些條件過濾值。在提供網格模式和字串列表後,我們將使用filter()lambda函式建立一個新列表。filter函式將過濾掉不匹配的字串,並在其中定義一個lambda函式,我們將檢查兩個模式的長度。

zip()函式將用於比較和配對字元。過濾條件將由lambda函式提供。

示例

以下是一個示例:

lis1 = ["Suresh", "Ramesh", "Ravi", "Raghav"]
mesh = "___e_h"
print(f"The original list is:{lis1}")

lis2 = list(filter(lambda words: len(words) == len(mesh) and all((letter1 == "_") or (letter1 == letter2)
   for letter1, letter2 in zip(mesh, words)), lis1))
print(f"The new list is: {lis2}")

輸出

The original list is:['Suresh', 'Ramesh', 'Ravi', 'Raghav']
The new list is: ['Suresh', 'Ramesh']

寶貴見解

上面討論的所有解決方案都遵循一個核心原則:為了比較字串和網格模式,它們的長度應該相等,即字串和網格應該具有相同數量的字元。此外,如果下劃線的位移發生變化,則模式識別也會發生變化。

結論

在本文中,我們討論了幾個多產且有效的解決方案來提取網格匹配字串。最初我們專注於理解網格匹配的概念,然後我們介紹瞭解決方案。我們應用了許多程式設計概念,包括“迭代”、“列表推導式”、“filter()”和“lambda函式”來實現我們的目標。

更新於: 2023年7月12日

81 次檢視

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告