Python字符串和列表
我已经在这个小问题上坐了几天了,我不知道我是完全错了还是错过了什么 目标:从句子中的每个单词中找到第一个元音,从单词中删除该元音后的字母,并将其余字母乘以3 示例:如果我有一句话:“Hello World”,那么想要的输出应该是“HeHeHe wowo” 我的代码: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
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
编译正则表达式并重用已编译的正则表达式可能是个好主意。