4 回答
TA贡献1111条经验 获得超0个赞
前瞻可能很混乱,尤其是在边缘条件下。如果 list 为零或最后一个元素不是元音并且离开列表的末尾,该怎么办?另一种选择是随时跟踪状态。list[i + 1]
sample = ['b', 'e', 'a', 'a', 'e']
def accenting(sample_list):
vowel_changes = {
"a": "á",
"e": "é",
}
was_unaccented_vowel = False
for i, c in enumerate(sample_list):
if c in vowel_changes:
if was_unaccented_vowel:
sample_list[i] = vowel_changes[c]
was_unaccented_vowel = False
else:
was_unaccented_vowel = True
else:
was_unaccented_vowel = False
return sample_list
print(accenting(sample))
该代码更改了原始示例列表。您可以使用该语句将其转换为生成器并制作新副本yield
sample = ['b', 'e', 'a', 'a', 'e']
def accenting(sample_list):
vowel_changes = {
"a": "á",
"e": "é",
}
was_unaccented_vowel = False
for c in sample_list:
if c in vowel_changes:
if was_unaccented_vowel:
c = vowel_changes[c]
was_unaccented_vowel = False
else:
was_unaccented_vowel = True
else:
was_unaccented_vowel = False
yield c
print(list(accenting(sample)))
我还摆弄了一个状态机,尽管我很难声称它更好。
sample = ['b', 'e', 'a', 'a', 'e']
vowel_changes = {
"a": "á",
"e": "é",
}
def _state_no_accent_check(c):
if c in vowel_changes:
return _state_accent_check, c
else:
return _state_no_accent_check, c
def _state_accent_check(c):
return _state_no_accent_check, vowel_changes.get(c, c)
def accenting(sample_list):
state = _state_no_accent_check
for c in sample_list:
state, c = state(c)
yield c
print(list(accenting(sample)))
TA贡献2036条经验 获得超8个赞
此代码存在 2 个问题:
第一个也是最重要的一点是,它引发了一个IndexError(至少在我使用的Python3.7中),因为在第10行,当你在列表的末尾时,你试图访问list[i+1],所以你从列表的末尾掉下来,提高和异常。换句话说,当列表中最高的索引是4时,它会尝试访问list[5],因此它不知道该怎么做并崩溃。我建议通过向后看而不是向前看来解决这个问题。我的意思是:与其检查list[i+1]是否是元音,不如检查list[i-1]是否是元音。这样,您可以从索引 1 开始,因为索引 0 无论如何都不能是连续的元音。请记住,您必须注意不要连续重音第三个元音;我会让你思考如何解决这个问题。
第二,你过度思考如何替换列表中的字母。你可以简单地说list[i] = vowel_changes[replacement]
TA贡献1798条经验 获得超3个赞
您可以使用字典来表示所需的字母映射,并使用 zip 将每个字符与其前置字符配对。使用列表理解,您可以在一行中获得结果:
mapping = { ("e","e"):"é", ("a","a"):"á" }
sample = ['b','e', 'a', 'a', 'e','c','e','e','z']
accented = [ {(a,b):b,**mapping}[(a,b)] for a,b in zip([""]+sample,sample) ]
print(accented)
# ['b', 'e', 'a', 'á', 'e', 'c', 'e', 'é', 'z']
TA贡献1946条经验 获得超4个赞
我们可以在此处进行一些更改,以使其执行所需的操作,并删除实际上不需要的额外代码行。
def accenting(lst): # Use lst instead of list. list is a python reserved keyword.
首先更改循环,这样我们就不会超出其列表的范围。由于我们正在展望未来,我们希望在列表的长度之前停止一个,以便我们可以查看下一个
for i in range(0, len(list)-1):
我们需要更改检查 lst[i+1] 的条件。你让它检查lst[i+1]是否在元音中。但这并不意味着它是连续的。这可能是彼此相邻的ae的情况。你已经检查了 lst[i] 是否在元音中,所以我们可以检查 lst[i+1] 是否等于它。
然后,if 语句可以用另一个语句进行扩展,并涵盖不给倍数重音的条件。
在括号中,我们检查 i 是否不等于 0,以便整个括号不会计入数组中的第一个字母,因为之前没有字母。然后,我们检查前面的字母是否等于当前字母。
if lst[i] in vowels and lst[i+1] == lst[i] and (i != 0 and lst[i-1] != lst[i]):
在 if 语句中,我们可以摆脱所有变量和第二个循环。由于我们知道 lst 中的位置,因此可以直接分配它。我们也知道我们想要元音中值的键,因此不需要循环。
lst[i] = vowels[lst[i]]]
之后,您可以只返回列表。
总代码如下所示。
sample = ['b' 'e', 'a', 'a', 'e']
vowels = "ae"
def accenting(lst):
vowel_changes = {
"a": "á",
"e": "é",
}
for i in range(0, len(list)-1):
if lst[i] in vowels and lst[i+1] == lst[i] and (i != 0 and lst[i-1] != lst[i]):
lst[i] = vowels[lst[i]]]
return lst
添加回答
举报