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函式”來實現我們的目標。