Python字符串和列表

Python字符串和列表,python,string,list,Python,String,List,我已经在这个小问题上坐了几天了,我不知道我是完全错了还是错过了什么 目标:从句子中的每个单词中找到第一个元音,从单词中删除该元音后的字母,并将其余字母乘以3 示例:如果我有一句话:“Hello World”,那么想要的输出应该是“HeHeHe wowo” 我的代码: def bebis(inrad): utrad = "" inrad = inrad.split() for tkn in inrad: for tkn1 in tkn: #Eftersom

我已经在这个小问题上坐了几天了,我不知道我是完全错了还是错过了什么

目标:从句子中的每个单词中找到第一个元音,从单词中删除该元音后的字母,并将其余字母乘以3

示例:如果我有一句话:“Hello World”,那么想要的输出应该是“HeHeHe wowo”

我的代码:

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循环,一个应该遍历每个单词,另一个应该遍历每个单词中的每个字母。如果它找到一个元音,数一数它在哪里,然后将字母返回到单词的第一个元音


我的问题:输出只给我一个句子中的第一个单词,然后从那里中断。所以“你好世界”产生了“呵呵”的效果,让我非常沮丧。为什么它不贯穿句子的其余部分?

您的方法似乎是正确的(将句子拆分为单词,并在单词上迭代以找到第一个元音)

问题是您的
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
这里,我们使用
枚举
函数,它将给出元组列表
(索引,字母)
。测试当前字母是否为元音后,我们取单词的第一个字母(
tkn[:i+1]
),重复三次,存储在
utrad
中,然后移动到下一个单词(使用离开当前循环的
break
语句)。
我们只需要在单词之间添加一个额外的空格。

这样的东西怎么样:

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")
输出:

呵呵呵呵


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

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\u voral\u index
    ,它可以构造得更好
  • 与正则表达式版本相比,一个折衷方案是,随着单词变长(并且单词中的元音“更深”),这将变得更慢。OTOH,我猜简而言之,正则表达式的开销可能有点昂贵
吹毛求疵:使用
re.compile
编译正则表达式并重用已编译的正则表达式可能是个好主意。