试图找出一种在列表中查找连续元素的方法

我试图做的是:对于列表中两个连续元音的每个实例,第二个元音将变为重音,但前提是前一个元音没有重音。对Python来说还是新手,这就是我现在拥有的:


sample = ['b' 'e', 'a', 'a', 'e'] 

vowels = "ae"


def accenting(list):

    vowel_changes = {

        "a": "á",

        "e": "é",

    }

    for i in range(0, len(list)):

        if list[i] in vowels and list[i + 1] in vowels:

            vowel_to_change = list[i + 1]

            for replacement in vowel_changes:

                if replacement in vowel_to_change:

                    vowel_to_change = vowel_to_change.replace(replacement, vowel_changes[replacement])

            print(vowel_to_change)

    return list


print(accenting(sample))

目标是拥有类似的东西:['b' 'e', 'á', 'a', 'é']。现在它返回“á”,“á”和“é”。因此,我难以弄清楚的两件事是1)将替换放回列表中的相应位置,以及2)让函数每隔一个元音而不是每个元音更改一次。我想我可能需要为1切割并创建一个新列表,也许对2有另一个条件?不确定。


一只萌萌小番薯
浏览 165回答 4
4回答

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python