为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2022-08-16 18:56:00
我试图做的是:对于列表中两个连续元音的每个实例,第二个元音将变为重音,但前提是前一个元音没有重音。对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 listprint(accenting(sample))目标是拥有类似的东西:['b' 'e', 'á', 'a', 'é']。现在它返回“á”,“á”和“é”。因此,我难以弄清楚的两件事是1)将替换放回列表中的相应位置,以及2)让函数每隔一个元音而不是每个元音更改一次。我想我可能需要为1切割并创建一个新列表,也许对2有另一个条件?不确定。
查看完整描述

4 回答

?
catspeake

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)))


查看完整回答
反对 回复 2022-08-16
?
慕桂英3389331

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]


查看完整回答
反对 回复 2022-08-16
?
呼如林

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']


查看完整回答
反对 回复 2022-08-16
?
绝地无双

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


查看完整回答
反对 回复 2022-08-16
  • 4 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信