Python 提取网格匹配字符串程序
模式识别是一个重要的编程概念。它允许我们检索满足特定条件的特定数据,或匹配特定顺序的数据。这个原理在各个领域都很有帮助,包括 语言 和 图像处理 。字符串匹配帮助我们从大量的数据中提取有意义的信息。
在本文中,我们将讨论从给定字符串列表中提取 网格匹配 字符串的类似概念。网格匹配侧重于提取“ 相似的 ”等长字符串,让我们详细讨论这个问题。
理解问题
主要概念是提取符合特定模式的相似字符串。网格字符串包含缺失字符,应该提取与网格的隐藏模式匹配的字符串。让我们通过一个示例来理解这个问题 –
输入输出场景
Input:
lis1 = ["Suresh", "Ramesh", "Ravi", "Raghav"]
mesh = "___e_h"
网格包含字母“ e ”和“ h ”,以及一些缺失的字符形成的模式。我们需要从列表中提取与网格模式匹配的字符串。
Output: ['Suresh', 'Ramesh']
显然,“Suresh”和“Ramesh”这两个词符合网格图案。现在我们已经理解了问题陈述,让我们讨论一些解决方案。
使用迭代和Zip()
在传递字符串列表和网格图案之后,我们将创建一个空列表来存储提取出的字符串。我们将使用“for”循环遍历每个字符串,在循环内部我们将建立一个条件,检查当前“string”(单词)的长度是否等于网格的长度。
这使我们能够选择与网格匹配的相关字符串。该条件还检查网格中的字符是否为“underscore”或与单词中的相应字符匹配。
使用这两个条件,我们将提取与网格图案匹配的词。如果字符串和它们的字符都满足条件,则将使用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函数”,以实现我们的目标。