2012-09-22 168 views
3

幾天後,我一直坐在這個小問題上,我不知道我是否全錯或者錯過了某些東西。Python字符串和列表

的目的:從句子中的每個字 - 查找第一個元音,從字元音後刪除字母和3

乘其餘字母的例子:如果我有句子:「Hello World」的想要的輸出應該是「HeHeHe WoWoWo」。

我的代碼:

def bebis(inrad): 
    utrad = "" 
    inrad = inrad.split() 
    for tkn in inrad: 
     for tkn1 in tkn: #Eftersom tkn ar ordlista nu. 
      if tkn1 in vokaler: 
       count = len(tkn1) 
       utrad += tkn1 
      elif tkn1 in konsonanter: 
       utrad += tkn1 
    return utrad[:count+1]*3 

print("Bebisspraket:",bebis(inrad)) 

我的想法:我採用分體式分裂句成詞的列表()。然後我使用兩個for循環,一個應該貫穿每個單詞,另一個應該貫穿每個單詞的每個字母。如果它找到一個元音,請計算它的位置,然後將這些字母返回到單詞的第一個元音。

我的問題:輸出只給了我一個句子中的第一個WORD,並從那裏打破。所以,「Hello World」產生「HeHeHe」讓我感到非常沮喪。爲什麼它不通過句子的其餘部分?

回答

0

你的方法似乎是正確的(將句子拆分爲單詞並迭代單詞以找到第一個元音)。

的問題是,你的tkn1變量是一個字母,所以len(tkn1)始終爲1,so count=1

這裏有一個潛在的解決方案:

def bebis(inrad): 
    utrad = "" 
    inrad = inrad.split() 
    # Loop on words 
    for tkn in inrad: 
     # Loop on letters in the word 
     for (i,tkn1) in enumerate(tkn): #Eftersom tkn ar ordlista nu. 
      if tkn1 in vokaler: 
       utrad += tkn[:i+1] * 3 
       break 
     utrad += " " 
    return utrad 

在這裏,我們使用enumerate功能,這將使列表的元組(index,letter)。一旦我們測試了當前字母是元音字母,我們將該字的第一個字母(tkn[:i+1])重複三次,將它們存儲在utrad中並移至下一個字(使用break語句離開當前循環)。 我們只需要在單詞之間添加額外的空格。

4

怎麼是這樣的:

import re 

def bebis_word(word): 
    first_vowel = re.search("[aeiou]", word, re.IGNORECASE) 

    if first_vowel: 
     return word[0:first_vowel.start() + 1] * 3 
    else: 
     return ''  

def bebis(sentence): 
    words = [bebis_word(word) for word in sentence.split()] 

    return " ".join(words) 

print bebis("Hello World") 

輸出:

呵呵呵WoWoWo

+1

Nitpicky:用're.compile'編譯正則表達式並重用編譯後的正則表達式可能是一個好主意。 –

0

正如正則表達式的方法替代,我所做的:

def find_vowel_index(word): 
    vows = set(["a", "e", "i", "o", "u"]) 
    for i, letter in enumerate(word): 
      if letter in vows: 
        return i 
    return -1 

def bebis(s, repeat=3): 
    return " ".join([word[0:find_vowel_index(word)+1] * repeat for word in s.split() if find_vowel_index(word) >= 0]) 

個思考:

  • 我做了元音爲「中」上一組測試一組是一個常數時間的操作(O(1))
  • 添加一個可選的重複參數bebis,所以,如果你想這個詞來重複3次以外的次數很容易。
  • 我不喜歡find_vowel_indexbebis多次調用,它可以更好地結構。
  • 在正則表達式版本中的一個折衷是,當文字變得更長(並且元音「更深」)時,這將變得更慢。 OTOH,我猜想用簡單的話來說,正則表達式的開銷可能有點貴。
相關問題