Python字符串和列表

时间:2012-09-22 13:45:35

标签: python string list

几天来一直坐在这个小问题上,我不知道我是否全部错了或者错过了什么。

目标:从一个句子中的每个单词 - 找到第一个元音,从单词中删除该元音之后的字母,并将剩余的字母乘以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循环,一个应该遍历每个单词,另一个应该遍历每个单词中的每个单词。如果它找到一个元音,计算它的位置,然后将字母返回到该单词的第一个元音。

我的问题:输出只给出了句子中的第一个WORD并从那里打破了。因此,“Hello World”产生了“HeHeHe”让我非常沮丧。为什么不通过句子的其余部分?

3 个答案:

答案 0 :(得分: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")

输出:

  

HeHeHe WoWoWo

答案 1 :(得分: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中并移到下一个单词(使用{离开当前循环的{1}}语句。 我们只需在单词之间添加一个额外的空格。

答案 2 :(得分: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_index中对bebis的多次调用,它可以更好地构建。
  • 对正则表达式版本的权衡是,随着单词变长(并且单词中的元音“更深”),这将变得更慢。 OTOH,我猜想在短语中,正则表达式的开销可能有点贵。