2017-10-20 191 views
0

我正在輔導一個朋友在python中,而不是自己很擅長。這項任務是編寫一個腳本,用於反轉一些外來語言,在添加字母「p」後重復每個元音序列。一些例子:優化初學python腳本關於子串替換

tomato -> topomapatopogroovy->groopoovybeautiful -> beaupeautipifupul

的目標,是扭轉這一點。來自groopoovy -> groovy

由於這是一個荷蘭的任務,有一個例外:「ij」被視爲一個元音。所以blijpij -> blij(我發現很多事情很複雜)

我的解決方案對我來說似乎相當笨重,我對更好,更優雅的解決方案感興趣。由於這是編程的入門課程,不幸的是,基礎知識是關鍵。

word = input() 
    vowels = ('a', 'e', 'i', 'o', 'u') 
    position = 0 
    solution = "" 
    while position < len(word): 
     if word[position] == 'p':  # obviously, search for the letter 'p' 
      add = 1      # keep track of the sub string size 
      group = "" 
      while True:     # loop to get consecutive vowels 
       if word[position + add] in vowels: 
        group += word[position + add] 
        if word[position + add] == 'i' and word[position + add + 1] == 'j': # recognize the "ij" 
         group += 'j' 
         add += 1 
        add += 1 
       else: 
        break 
       if position+add == len(word):  # stay within the bounds of the string 
        break 
      add -= 1 
      if word[position - add:position].lower() == group.lower() and group != "": 
       position += add 
      else: 

       solution += 'p' 
     else: 
      solution += word[position] 
     position += 1 
    print(solution) 

回答

0

這個怎麼樣,對於入門Python類。 頂部有幾個例子單詞;只是改變評論#。

我不檢查每一步的「p」,而是檢查元音序列的開始。該序列將始終以「p」結尾。這是唯一不希望將該字符附加到解決方案的情況;相反,你想跳到元音序列的末尾。

「ij」是一個元音的事實並沒有創建一個特例,因爲「i」開始了一個元音序列。

word = "poopoo-poopoo" 
# word = "poopooh" 
# word = "hijipijinks" 
# word = "apapepe" 
# word = "copovfepefepe" 
vowels = ('a', 'e', 'i', 'o', 'u') 
position = 0 
solution = "" 
vowel_count = 0 # consecutive vowels 
while position < len(word): 
    c = word[position] 
    if vowel_count > 0: 
     if c == 'p': 
      position += vowel_count + 1 
      vowel_count = 0 
      continue 
     vowel_count += 1 
    else: 
     if c in vowels: 
      vowel_count = 1 
    solution += c 
    position += len(c) 

print(solution) 
+0

這確實是我尋找的更優雅的解決方案。謝謝保羅。當'c =='p''時,它需要一個小小的調整來檢查左側和右側的部分,否則,'海角'這樣的字會被破壞。 –

+0

該程序假定輸入單詞根據您的配方格式化,並且不檢查它的語法或拼寫錯誤。你的版本也不檢查。 「斗篷」不是有效的輸入。 「capapepe」*是*有效並正確給出結果「斗篷」。 –

1
import re 
input_text = "tomato" 
encoded = re.sub('([aeiou]+)','\\1p\\1',input_text) 
print(encoded) 
decoded = re.sub('([aeiou]+)p\\1','\\1',encoded) 
print(decoded) 

應該做到這一點

+0

感謝您的快速回復。我也在考慮使用正則表達式,但不知道如何處理「ij」-is-a-vowel部分。仍然想不到一個正則表達式來做到這一點.. –

+1

@FrankVermeulen更改'[aeiou]'爲'(?:[aeiou] | ij)' – Barmar

+0

使用一個原始字符串,所以你不需要加倍反斜槓。 – Barmar