-
catspeake
前瞻可能很混乱,尤其是在边缘条件下。如果 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))该代码更改了原始示例列表。您可以使用该语句将其转换为生成器并制作新副本yieldsample = ['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 cprint(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, cdef _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 cprint(list(accenting(sample)))
-
慕桂英3389331
此代码存在 2 个问题:第一个也是最重要的一点是,它引发了一个IndexError(至少在我使用的Python3.7中),因为在第10行,当你在列表的末尾时,你试图访问list[i+1],所以你从列表的末尾掉下来,提高和异常。换句话说,当列表中最高的索引是4时,它会尝试访问list[5],因此它不知道该怎么做并崩溃。我建议通过向后看而不是向前看来解决这个问题。我的意思是:与其检查list[i+1]是否是元音,不如检查list[i-1]是否是元音。这样,您可以从索引 1 开始,因为索引 0 无论如何都不能是连续的元音。请记住,您必须注意不要连续重音第三个元音;我会让你思考如何解决这个问题。第二,你过度思考如何替换列表中的字母。你可以简单地说list[i] = vowel_changes[replacement]
-
呼如林
您可以使用字典来表示所需的字母映射,并使用 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']
-
绝地无双
我们可以在此处进行一些更改,以使其执行所需的操作,并删除实际上不需要的额外代码行。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