几天来一直坐在这个小问题上,我不知道我是否全部错了或者错过了什么。
目标:从一个句子中的每个单词 - 找到第一个元音,从单词中删除该元音之后的字母,并将剩余的字母乘以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”让我非常沮丧。为什么不通过句子的其余部分?
答案 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])
思想:
(O(1))
find_vowel_index
中对bebis
的多次调用,它可以更好地构建。