对于可能不太有用的标题,我表示歉意,我不知道如何将这个问题总结为一句话。
我正在尝试计算 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 (带有二合字母)
说明:
-
识别元音:
我们使用一组元音 (
vowels
) 来快速检查一个字符是否是元音。 -
迭代单词:
我们使用
while
循环和索引 (i
) 来遍历单词。这使我们可以灵活地根据需要跳过字符。 - 逐对查看字符: 在每次迭代中,我们查看当前字符和下一个字符(如果存在)。
- 分类字符: 我们确定当前字符和下一个字符是元音还是辅音。
- 更新单位计数:
-
如果当前字符和下一个字符是不同类型(一个元音,一个辅音),则它是一个 CV 或 VC 单元。我们将单位计数增加 1,并将索引
i
增加 2 以跳过下一个字符(因为它已包含在当前单元中)。 -
如果当前字符和下一个字符是同一类型(两个都是元音或两个都是辅音),则它是一个单独的 C 或 V 单元。我们将单位计数增加 1,并将索引
i
增加 1 以移动到下一个字符。
处理二合字母:
为了处理二合字母(如“th”、“gh”、“ch”等),需要在主循环之前添加一个步骤。以下是如何操作:
-
识别二合字母:
创建一个二合字母列表,并使用
replace()
方法用唯一字符(例如“_”)替换单词中的任何二合字母。 -
应用主算法:
在修改后的单词上运行上述
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