亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

試圖找出一種在列表中查找連續元素的方法

試圖找出一種在列表中查找連續元素的方法

一只萌萌小番薯 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', 'é']?,F在它返回“á”,“á”和“é”。因此,我難以弄清楚的兩件事是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 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號