2017-10-20 203 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