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
添加回答
舉報