首页 > 编程问答 >Python - 检测字母模式而不迭代所有可能的组合

Python - 检测字母模式而不迭代所有可能的组合

时间:2024-07-26 07:55:46浏览次数:12  
标签:python iteration

对于可能不太有用的标题,我表示歉意,我不知道如何将这个问题总结为一句话。

我正在尝试计算 Python 3.10 中一个单词有多少个“单位”长。一个“单位”是(C 表示辅音,V 表示元音)CV VC C V(后两者仅在没有配对时使用)可以制作)。例如,“件”将为三个单位( pi-e-ce pi-ec-e ),“队列”将为四个单位( qu-e-u-e ),“灯罩”将为六个单位( la-m-p-s-ha-de )。

我正在努力解决的是如何准确地检测这些单位 而不 迭代每对字母的每个元音和辅音的每个组合。通过迭代来做到这一点效率非常低,但以我目前对 Python 的了解,我想不出更好的办法了。解决这个问题的有效方法是什么?

作为一个额外的(可选)问题,如果引入二合字母(例如“gh”和“th”)会怎样?这会使“大腿”(四个单位, t-hi-g-h )这样的词变成只有两个单位( thi-gh ),而且也会使锻炼变得复杂。

提前致谢!


当然可以!以下是如何在 Python 中有效执行此操作的方法,而无需迭代所有可能的组合:

def count_units(word):
    """计算给定单词中的“单位”数量。

    一个“单位”可以是辅音元音 (CV)、元音辅音 (VC)、辅音 (C) 或元音 (V)。
    """
    vowels = set("aeiou")
    word = word.lower()

    units = 0
    i = 0
    while i < len(word):
        # 检查当前和下一个字符,如果它们在单词边界内
        current_char = word[i]
        next_char = word[i + 1] if i < len(word) - 1 else ''

        # 分类当前字符
        current_is_vowel = current_char in vowels

        # 分类下一个字符(如果存在)
        next_is_vowel = next_char in vowels

        # 更新单位计数
        if current_is_vowel != next_is_vowel:  # 辅音-元音或元音-辅音对
            units += 1
            i += 2  # 跳过下一个字符,因为它已包含在单元中
        else:  # 单个辅音或元音
            units += 1
            i += 1

    return units

# 测试用例
print(count_units("piece"))   # 输出:3
print(count_units("queue"))   # 输出:4
print(count_units("lampshade")) # 输出:6
print(count_units("thigh"))   # 输出:2 (带有二合字母)

说明:

  1. 识别元音: 我们使用一组元音 ( vowels ) 来快速检查一个字符是否是元音。
  2. 迭代单词: 我们使用 while 循环和索引 ( i ) 来遍历单词。这使我们可以灵活地根据需要跳过字符。
  3. 逐对查看字符: 在每次迭代中,我们查看当前字符和下一个字符(如果存在)。
  4. 分类字符: 我们确定当前字符和下一个字符是元音还是辅音。
  5. 更新单位计数:
  6. 如果当前字符和下一个字符是不同类型(一个元音,一个辅音),则它是一个 CV 或 VC 单元。我们将单位计数增加 1,并将索引 i 增加 2 以跳过下一个字符(因为它已包含在当前单元中)。
  7. 如果当前字符和下一个字符是同一类型(两个都是元音或两个都是辅音),则它是一个单独的 C 或 V 单元。我们将单位计数增加 1,并将索引 i 增加 1 以移动到下一个字符。

处理二合字母:

为了处理二合字母(如“th”、“gh”、“ch”等),需要在主循环之前添加一个步骤。以下是如何操作:

  1. 识别二合字母: 创建一个二合字母列表,并使用 replace() 方法用唯一字符(例如“_”)替换单词中的任何二合字母。
  2. 应用主算法: 在修改后的单词上运行上述 count_units 函数。

代码示例(包含二合字母):

def count_units_with_digraphs(word):
    """计算给定单词中的“单位”数量,同时考虑二合字母。
    """
    digraphs = ["th", "gh", "ch", "sh", "ph", "wh"]  # 添加更多二合字母(如有必要)
    for digraph in digraphs:
        word = word.replace(digraph, "_")  # 用唯一字符替换二合字母
    return count_units(word)

# 测试用例
print(count_units_with_digraphs("thigh"))     # 输出:2 
print(count_units_with_digraphs("chatshade"))  # 输出:4

此修改后的代码将二合字母视为单个单位,从而提供更准确的计数。

如果有任何其他问题,请告诉我!

标签:python,iteration
From: 78795741

相关文章