2012-09-22 163 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,我猜想用简单的话来说,正则表达式的开销可能有点贵。
相关问题