我正在嘗試創建一個函式,對于字串中每次出現元音,反轉所述字串(并在執行此操作時包含元音)。對于我的理解,該功能有些復雜,因此我需要一些幫助,并且可能需要對其進行細分。但是,我只想使用我目前正在學習的運算子和陳述句(for/while 和 if)。如果可能的話,我也想避免使用串列理解。
下面是輸入和輸出的樣子:
一個示例輸入將是reverse_per_vowel('aerith')
回傳'iraeth'
如果我們把這個函式的程序分解成幾個步驟,它應該是這樣的:
( a )erith → ( a )erith (第一個字母是元音,所以顛倒過來。不過,因為是字串中的第一個字母,所以看不出有什么變化。)
(a e )rith → ( e a)rith (第二個字母也是元音,因此字串中的每個字母都顛倒過來,包括元音。)
(ear i )th → ( i rae)th (第四個字母是元音,所以前面的所有字母都被顛倒了。注意它是如何解釋之前顛倒的字串中的字母的。)
如您所見,字串反轉的次數是累積的,我不太確定如何為此撰寫代碼。但是,我嘗試撰寫該函式的一個組件。
我正在嘗試什么
vowellist = 'aeiouAEIOU'
sampleword = 'aerith'
indexlist = []
for i in range(len(sampleword)):
if sampleword[i] in vowel_list:
indexlist.append(i)
indexlist
輸出:[0, 1, 3]
此摘錄不會反轉字串的任何部分,但它會回傳應該反轉字串的索引。我計劃做的是以某種方式將這些索引插入到示例單詞中,并使用 [::-1] 來反轉字串的一部分。但是,我不知道我將如何做到這一點,也不知道這是否是一個好主意。任何幫助,將不勝感激。
uj5u.com熱心網友回復:
如果有很多元音,那么重復的反轉似乎可以避免,因為第二次反轉在某種程度上是對先前反轉的撤消。
是的,你可以使用這個演算法:
構建兩個字串。他們開始為空,并將其中的第二個標記為“活動”。
以相反的順序訪問輸入的字符:從最后到第一個
- 只要它們是輔音,就將它們添加到當前活動的字串中
- 當它是元音時,將活動字串切換為另一個,并在那里添加元音
在此程序結束時,反轉第二個字串并回傳兩個字串的連接:
VOWELS = set("aeiouAEIOU")
def reverse_per_vowel(s):
endings = ["", ""]
side = 1
for c in reversed(s):
if c in VOWELS:
side = 1 - side # Toggle between 0 and 1
endings[side] = c
return endings[0] endings[1][::-1]
由于該演算法不是在每次遇到元音時都反轉,而是在最后只執行一次反轉,因此它以線性時間復雜度運行,這與您從字面上實作所描述的程序相反,它具有最壞情況下的時間復雜度O(n2)。
通過這種復雜性分析,我假設用字符擴展字串是一個恒定的時間程序。如果對此有疑問,則使用兩個字串列來實作它,在程序結束時呼叫append并執行 ajoin以獲得最終字串:
VOWELS = set("aeiouAEIOU")
def reverse_per_vowel(s):
endings = [[], []]
side = 1
for c in reversed(s):
if c in VOWELS:
side = 1 - side # Toggle between 0 and 1
endings[side].append(c)
return "".join(endings[0] endings[1][::-1])
uj5u.com熱心網友回復:
實作此目的的一種簡單方法是使用遞回:
vowels = set('aeiouAEIOU')
def reverse_per_vowel(s):
if not s: # empty string
return ''
beforelast, last = s[:-1], s[-1]
if last in vowels:
return last reverse_per_vowel(beforelast)[::-1]
return reverse_per_vowel(beforelast) last
print(reverse_per_vowel('aerith')) # iraeth
uj5u.com熱心網友回復:
您可以通過對for回圈的簡單修改和一些高級切片來做到這一點:
vowellist = 'aeiouAEIOU'
sampleword = 'aerith'
for i in range(len(sampleword)):
if sampleword[i] in vowellist:
sampleword = sampleword[i::-1] sampleword[i 1:]
print(sampleword)
如果出現元音,則每次迭代都可以重新分配新的部分反轉的字串。輸出:
iraeth
你可以幫助我的國家,查看我的個人資料資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457659.html
