3

几天来一直坐在这个小问题上,我不知道是我错了还是错过了一些东西。

目标:从句子中的每个单词 - 找到第一个元音,从单词中删除该元音后面的字母并将剩余的字母乘以 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))

我的想法:我使用 split() 将句子拆分为单词列表。然后我使用两个 for 循环,一个应该遍历每个单词,另一个应该遍历每个单词中的每个字母。如果它找到一个元音,计算它在哪里,然后将字母返回到单词的第一个元音。

我的问题:输出只给了我一个句子中的第一个单词并从那里中断。所以“Hello World”产生“HeHeHe”让我非常沮丧。为什么它没有通过其余的句子?

4

3 回答 3

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")

输出:

嘿嘿嘿哇哇哇

于 2012-09-22T14:06:50.243 回答
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])

想法:

  • 我为元音做了一个集合,因为集合上的“in”测试是一个恒定时间操作(O(1))
  • 为 bebis 添加了一个可选的重复参数,因此如果您希望单词重复 3 次以外的次数,很容易做到这一点。
  • 我不喜欢对find_vowel_indexin的多次调用bebis,它的结构可以更好。
  • 对正则表达式版本的权衡是,随着单词变长(并且单词中的元音“更深”),它会变慢。OTOH,我猜用简短的话来说,正则表达式的开销可能有点高。
于 2012-09-22T14:48:27.807 回答
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]) 的第一个字母,重复它们 3 次,将它们存入utrad并移动到下一个单词(使用break离开当前循环的语句)。我们只需要在单词之间添加一个额外的空格。

于 2012-09-22T13:59:54.813 回答