Python字符串和列表

2024-09-30 20:33:07 发布

您现在位置: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))

我的想法:我使用split()将句子分成一系列单词。然后我用两个for循环,一个遍历每个单词,另一个遍历每个单词中的每个字母。如果找到一个元音,数一数它所在的位置,然后将字母返回到单词的第一个元音。在

我的问题:输出只给我一个句子中的第一个单词,并从那里中断。所以“你好世界”让我非常沮丧。为什么它没有贯穿整个句子?在


Tags: in示例目标forcount字母单词句子
3条回答

作为正则表达式方法的一种替代方法,我做到了:

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中添加了一个可选的repeat参数,这样如果你想让单词重复3次以外的次数,那么这样做很容易。在
  • 我不喜欢在bebis中对find_vowel_index的多次调用,它的结构可能更好。在
  • 相对于regex版本的一个折衷是,随着单词变长(单词中的元音“更深”),这一过程会变得更慢。奥托,我猜在简短的词上,正则表达式的开销可能有点昂贵。在

这样的怎么样:

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

你的方法似乎是正确的(把句子分成几个单词,然后在单词上重复找到第一个元音)。在

问题是您的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语句)。 我们只需要在单词之间增加一个空格。在

相关问题 更多 >