用于检查几乎相似字符串的 Python 程序

pythonserver side programmingprogramming更新于 2023/12/28 23:55:00

Python 中的字符串是用于表示文本数据的字符序列,括在引号中。检查几乎相似的字符串涉及比较和测量它们的相似性或不相似性,从而可以使用诸如 Levenshtein 距离或模糊匹配算法之类的技术来执行拼写检查和近似字符串匹配等任务。

在本文中,我们将学习一个用于检查几乎相似字符串的 Python 程序。

演示

假设我们已经获取了一个输入字符串

Input

Input string 1:  aazmdaa
Input string 2:  aqqaccd
k: 2

输出

Checking whether both strings are similar:  True

在此示例中,"a"在字符串 1 中出现 4 次,在字符串 2 中出现 2 次,4 - 2 = 2,在范围内,同样,所有字符都在范围内,因此为真。

使用的方法

以下是完成此任务的各种方法:

  • 使用 for 循环、ascii_lowecase、字典理解和 abs() 函数

  • 使用 Counter() 和 max() 函数

使用 for 循环、ascii_lowecase、字典理解和 abs() 函数

在此方法中,我们将学习如何使用简单的 for 循环、ascii_lowecase、字典理解和 abs() 函数来检查相似字符串

字典理解语法

{key_expression: value_expression for item in iterable}

字典推导式是 Python 中一种紧凑而简洁的方法,通过迭代可迭代对象并基于表达式定义键值对来创建字典,从而实现高效且可读的代码。

abs() 函数语法

abs(number)

Python 中的 abs() 函数返回数字的绝对值,即不考虑其符号的数值。它对于获取给定数字的大小或与零的距离很有用。

算法(步骤)

以下是执行所需任务所要遵循的算法/步骤

  • 使用 import 关键字从字符串模块导入 ascii_lowercase

  • 创建一个函数 findFrequency(),通过接受输入字符串作为参数来返回字符串字符的频率

  • 获取一个字典,并用所有小写字母作为键和值填充它 0。

  • 使用 for 循环 遍历输入字符串。

  • 将当前字符的频率增加 1。

  • 返回字符。

  • 创建一个变量来存储输入字符串 1

  • 创建另一个变量来存储输入字符串 2

  • 打印两个输入字符串。

  • 创建另一个变量来存储输入 k

  • 通过将输入字符串作为参数传递,调用上述 findFrequency() 函数来获取输入字符串 1 的字符频率。

  • 类似地,获取输入字符串 2 的字符频率。

  • 将结果初始化为 True

  • 使用 for 循环 遍历小写字母。

  • 使用 if 条件 语句,使用 abs() 函数(返回数字的绝对值)检查两个字符串当前字符频率的绝对差是否大于 k。

  • 如果条件为 true,则将结果更新为 False

  • 中断循环。

  • 打印结果。

示例

以下程序使用 for 循环、ascii_lowecase、字典理解和 abs() 函数返回给定字符串是否几乎相似

# 从字符串模块导入 ascii_lowercase
from string import ascii_lowercase
# 创建一个函数,通过接受输入字符串作为参数来返回字符串字符的频率
def findFrequency(inputString):
    # 获取字典并以所有小写字母作为键填充
    # 值为 0
    frequency = {c: 0 for c in ascii_lowercase}
    # 遍历给定字符串
    for c in inputString:
        # 将字符频率增加 1
        frequency[c] += 1
        # 返回字符频率
        return frequency

# 输入字符串 1
inputString_1 = 'aazmdaa'
# 输入字符串2
inputString_2 = "aqqaccd"
# 打印输入字符串
print("输入字符串 1: ", inputString_1)
print("输入字符串 2: ", inputString_2)
# 输入 K 值
K = 2
# 获取输入字符串 1 的字符频率
# 通过调用上面的 findFrequency() 函数
stringFrequency1 = findFrequency(inputString_1)
# 获取输入字符串 2 的字符频率
stringFrequency2 = findFrequency(inputString_2)
# 将结果初始化为 True
result = True
# 遍历所有小写字符
for c in ascii_lowercase:
	# 检查两个字符串当前字符频率的绝对差是否大于 k
    if abs(stringFrequency1[c] - stringFrequency2[c]) > K:
        # updating False to the result if the condition is true
        result = False
        # break the loop
        break
# printing the result
print("检查两个字符串是否相似: ", result)

输出

执行时,上述程序将生成以下输出

输入字符串 1:aazmdaa
输入字符串 2:aqqaccd
检查两个字符串是否相似:True

使用 Counter() 和 max() 函数

在此方法中,我们将使用 Counter 和 max 函数的组合来检查与给定字符串几乎相似的字符串。

Counter() 函数:一个计算可哈希对象的子类。它在调用时隐式创建一个可迭代对象的哈希表。

counter_object = Counter(iterable)

算法(步骤)

以下是执行所需任务需要遵循的算法/步骤

  • 使用 import 关键字从 collections 模块导入 Counter 函数。

  • 创建另一个变量来存储 输入 k

  • 使用 lower() 函数(将字符串中的所有大写字符转换为小写字符)将输入字符串 1 转换为小写,然后使用 Counter() 函数获取输入字符串的字符频率1.

  • 以同样的方式,先将输入字符串 2 转换为小写,获取其字符频率。

  • 将结果初始化为 True

  • 使用 if 条件语句检查字符串是否相似。

  • max() 方法(返回可迭代对象中值最高的项/最大数字)

  • 如果条件为 true,则将结果更新为 False

  • 打印结果。

示例

以下程序使用 counter()、max() 函数返回给定的字符串是否几乎相似

# 从 collections 模块导入 Counter
from collections import Counter
# 输入字符串 1
inputString_1 = 'aazmdaa'
# 输入字符串 2
inputString_2 = "aqqaccd"
# 打印输入字符串
print("输入字符串 1: ", inputString_1)
print("输入字符串 2: ", inputString_2)
# 输入 K 值
K = 2
# 将输入字符串 1 转换为小写然后
# 获取输入字符串 1 的字符频率
strFrequency_1 = Counter(inputString_1.lower())
# 将输入字符串 2 转换为小写然后
# 获取输入字符串 2 的字符频率
strFrequency_2 = Counter(inputString_2.lower())
# 将结果初始化为 True
result = True
# 检查字符串是否相似与否
if(max((strFrequency_1 - strFrequency_2).values()) > K
    or max((strFrequency_2 - strFrequency_1).values()) > K):
    # 如果条件为真,则将结果更新为 False
    result = False
# 打印结果
print("检查两个字符串是否相似: ", result)

输出

执行时,上述程序将生成以下输出

输入字符串 1:aazmdaa
输入字符串 2:aqqaccd
检查两个字符串是否相似:True

结论

在本文中,我们学习了两种不同的方法来检查几乎相似的字符串。我们学习了如何遍历小写字母。使用 dictionary(hashing) 和 counter() 函数,我们学习了如何计算给定字符串中每个字符的频率。


相关文章