【问题标题】:Slicing list to remove certain objects with Python [duplicate]切片列表以使用 Python 删除某些对象 [重复]
【发布时间】:2020-11-21 13:08:20
【问题描述】:

我正在尝试删除 word 中的元音对象(word 是组成 userWord 的字母列表)。如果 userWord 以辅音开头,代码可以正常工作(删除所有元音),但如果 useWord 以元音开头,它不会删除第一个元音,而我想删除 useWord 中的所有元音。我跳过了什么吗?抱歉,我是初学者。我正在使用 Python 3.8.5

def voweleater(userWord):
    word = list(userWord)
    vowels = ['a', 'e', 'i', 'o', 'u']
    for letter in word:
        for i in vowels:
            if i in word:
                word.remove(i)
        print(letter)
voweleater("abstemious")

Code output:

a
s
t
m
s

【问题讨论】:

  • 在迭代列表时从列表中删除内容通常是个坏主意。

标签: python list for-loop


【解决方案1】:

正则表达式方法(更简洁,可能更优化)

from re import sub

def remove_vowels(word):
    return sub(r'[aeiouAEIOU]', "", word)

print(remove_vowels("abstemious")) # Returns "bstms"

正则表达式[aeiouAEIOU] 匹配任何没有重音的元音,然后我们使用re.sub 将找到的匹配替换为空格。

数组拆分方法(更冗长,可能更慢)

def remove_vowels(word):
    characters = list(word)
    vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']

    for index, letter in reversed(list(enumerate(characters))):
        if letter in vowels:
            characters.pop(index)
    
    return "".join(characters)

print(remove_vowels("abstemious")) # Returns "bstms"

这样,您将反向遍历您的字符(因此您将始终从末尾删除值,防止您意外尝试读取不再存在的索引)。如果当前字母是元音,则删除它。然后返回一个连接剩余字符的字符串。

【讨论】:

  • 感谢@Telmo Trooper,这在某种程度上可行。我想知道是否可以在不导入任何模块的情况下完成。
  • @RobleyOchieng 好的,我更新了我的答案以添加一种不需要任何导入的方法,类似于您最初尝试的方法。如果这个答案对你有帮助,请点赞。 ?️
  • 谢谢@Telmo Trooper,你更新的那个更适合我:非常感谢。
  • 我的赞成票还不能反映出来,因为我是新来的。我会支持它,它对我有帮助
  • 没问题。我相信你可以“接受”这个答案。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2020-07-15
  • 2020-11-08
  • 2018-05-27
  • 2013-05-28
相关资源
最近更新 更多