删除Python中的元音运行

删除Python中的元音运行,python,Python,因此,我对python相当陌生,我被一个问题困住了。基本上,我需要创建一个函数{remove_vouels_runsmessage,n:},它接受参数消息和{n}。{message}是任何文本字符串,{n}标记允许字符串包含连续元音的次数 到目前为止,我已经尝试过嵌套循环和导入函数,但我遇到了相同的问题,那就是我在消息迭代时修改了消息的长度和内容,这是不可避免的,在某种程度上,我的列表索引超出了范围 这是我到目前为止所拥有的 def remove_vowels_runs(message, n):

因此,我对python相当陌生,我被一个问题困住了。基本上,我需要创建一个函数{remove_vouels_runsmessage,n:},它接受参数消息和{n}。{message}是任何文本字符串,{n}标记允许字符串包含连续元音的次数

到目前为止,我已经尝试过嵌套循环和导入函数,但我遇到了相同的问题,那就是我在消息迭代时修改了消息的长度和内容,这是不可避免的,在某种程度上,我的列表索引超出了范围

这是我到目前为止所拥有的

def remove_vowels_runs(message, n):
vowels = ['a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U']
message = list(message)
list_length = len(message)
run = 0
for i in range(list_length):
i = int(i)
x = message[i]
if x not in vowels and run == n:
    run -= run
elif x not in vowels:
    run -= run
elif x in vowels and run <= n:
    run += 1
if run > n:
    message.remove(message[i])
    run -= run
    i -= i

return ''.join(message)
print(remove_vowels_runs('aeiou', 3))
我还有:

def remove_vowel_runs(message, n):
    message = list(message)
    string_length = len(message)
    for i in range(string_length):
        remove_n_vowels(message, i, n)
        return ''.join(message)


def remove_n_vowels(message, j, k):
    x = message[j]
    vowels = ['a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U']
    run = 1
    p = j+1
    while (run <= k) and (x in vowels):
        x = message[p]
        if x in vowels and run <= k:
            run += 1
            p += 1
        if x in vowels and run > k:
            message.remove(x)
        elif x not in vowels and run == k:
            run -= run
        elif x not in vowels and run != k:
            run -= run
    return x
基本上,问题是我只需要删除元音,如果它被连续放置在参数n的值之后,这才是问题的症结所在。这个问题我已经问了3个小时了,我已经准备好了。如果你是一个善良的人,请帮助我

以下是输入的一些预期结果-

函数调用:删除\u元音\u运行'Stony Brook University',2

返回值:“石溪大学”

函数调用:remove_元音_运行'aeiou',3

返回值:“aei”

函数调用:删除\u元音\u运行“石溪大学”,0


返回值:“Stny Brook nvrsty”

您的代码存在多个严重缺陷

removemessage[i]删除与message[i]相等的所有元素,而不仅仅是位置i处的元素。如果您只想删除这一个,那么可以删除消息[i]。 每次从消息中删除任何内容时,删除字符后的所有内容都会向左移动一个插槽。假设我是3,去掉元素3。然后,元件4移到插槽3,元件5移到插槽4,依此类推。然后,下一次通过循环,我是4,所以你看看新的4。这意味着你完全错过了原来的4,并且不会计算它。 每次从消息中删除某些内容时,它都会变小。但在列表开始之前你已经计算了len。假设你有6个字母,去掉3个。然后你看4。然后你看5…哦,没有5了;列表以4结尾,因此您得到一个索引器。 一次性解决所有这些问题的最简单方法是不要试图修改消息。相反,建立一个新的列表,添加您想要保留的邮件中的字母,同时跳过您不想保留的字母

您的代码中可能还有其他错误,但很难确定。例如,考虑这一点:

if x not in vowels and run == n:
    run -= run
elif x not in vowels:
    run -= run
在if x not In元音和run==n的情况下,执行与elif x not In元音相同的操作:case。想必,如果这是你想要的,你就不会为两个不同的案例而烦恼;如果x不在元音中,您只需要这样做:。所以你一定是想让这种区别起到某种作用……但很难猜出它的作用是什么

而且,i-=1没有影响,因为它位于for循环的末尾,其中i是循环变量,所以它将立即被重新赋值。在这种情况下,你可能想重复上一个字母,作为新一轮跑步的开始,但这没有意义,所以…你想在那里做什么?你为什么要做run-=run而不是run=0?这很奇怪,让我觉得你一定是想做些什么,而不是把它设为0……但我还是猜不出你想做什么。或者,为什么i=inti?你认为它是除了int之外的其他类型吗,或者你是想在这里做些别的什么,或者

如果您解决了所有这些问题,您将得到一个不会引发索引器的函数,并执行一些接近您想要的操作,但仍然不正确:

def remove_vowels_runs(message, n):
    vowels = ['a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U']
    result = []
    run = 0
    for x in message:        
        if x not in vowels:
            run = 0
            result.append(x)
        elif run <= n:
            run += 1
            result.append(x)
        else:
            run = 0
    return ''.join(result)

但也许这就足够让你想出下一步了?

好吧,我终于想出了办法。我没有在列表迭代时尝试修改列表,而是创建了一个空列表,并将布尔值分配给原始列表,然后根据原始列表的布尔值将原始列表附加到新列表。这是我的密码:

def remove_vowel_runs(message, n):
vowels = ['a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U']
message = list(message)
message_length = len(message)
new_msg = []
run = 0

for i in range(message_length):
    if (run < n) and (message[i] in vowels):
        run += 1
    elif (run >= n) and (message[i] in vowels):
        message[i] = False
    elif i not in vowels:
        run = 0
for j in range(message_length):
    if message[j] is not False:
        new_msg.append(message[j])
return ''.join(new_msg)

你能用可能的输入和输出更新这个问题吗?那会让你更加理解。是的。由于我找不到pdf的附件链接,我将发布一些输入和输出示例。我只是在我的帖子上添加了一些输入和输出,因为它不允许我在这里这么做。好吧,我按照你的建议做了。我创建了一个空列表,但现在我的问题是如何告诉我的代码允许n个以上的元音,只要它不是连续的。例如,“石溪大学”有7个元音,但如果“n”是2,则必须删除前两个元音字母后面的每3个元音。因此,函数将返回与给定的字符串完全相同的字符串。我可以筛选出元音,但它们被固定为只有n个元音,以及n通过后发现的任何元音。有什么建议吗?@SeungsooIm你们的代码在修复后已经在这样做了,只是有很多细节搞错了。首先,你用的是我修好的,但是你的建议用了很长时间 方法无论如何谢谢你。