【问题标题】:Filtering objects from lists in python从python中的列表中过滤对象
【发布时间】:2015-10-03 11:25:49
【问题描述】:

我正在尝试编写一些程序来过滤掉一串文本中的所有元音,但我不确定为什么我的函数不起作用。这是我的代码

def anti_vowel(text):
 letters = text.split() #make a list of all the letters in the string
 index = 0 #for del
 for x in letters:
     if x == "a" or x == "A" or x == "u" or x == "U" or x == "i" or x == "I" or x == "o" or x == "O" or x == "e" or x == "E":
         del letters[index]
     index += 1 #to make the if-clause work
 return "".join(letters) #turn the edited list into a string

在遍历字母时,如果字母中的对象是元音,则应该激活 if 子句,对吧?所以它应该删除那个对象。但是我做错了什么?

【问题讨论】:

  • 您不应该在迭代列表时更改它。
  • 您正在使用del letters[index]。列表越来越小,当您执行index += 1 时,您实际上是在跳过一个元素(由于删除而被移动)。

标签: python string list


【解决方案1】:

我会使用re.sub

re.sub(r'(?i)[AEIOU]', '', st)

说明:

  • (?i)不区分大小写修饰符有助于进行不区分大小写的匹配。
  • [AEIOU] 匹配给定列表中的任何一个字符。由于我们已经添加了不区分大小写的修饰符,这将匹配大写和小写元音。

【讨论】:

  • 介意在此处添加指向re.sub 的链接吗?
【解决方案2】:

''.join(c for c in text if c.lower() not in 'aeiou')

这使用生成器表达式来查看字符串中的每个字母,并且仅在它不是元音时才保留它(它的小写不在'aeiou'中),然后将这些有效字符连接起来。

【讨论】:

    【解决方案3】:

    您的代码不是遍历字母,而是遍历单词。这是因为text.split() 将您的文本拆分为由空格分隔的“单词”字符串组成的list

    下一个问题是您正在遍历 list 并删除条目。在迭代时改变一个可迭代对象是导致奇怪结果的常见原因。

    相反,请执行以下操作:

    def anti_vowel(text):
        return ''.join(filter(lambda x: x.lower() not in 'aeioe', text))
    

    结果:

    >>> anti_vowel('hi my name is joe')
    'h my nm s j'
    

    【讨论】:

      【解决方案4】:

      我更喜欢 Avinash 的方法,但如果你想修复你的 impl。操作方法如下:

      def anti_vowel(text):
          letters = list(text)
          i = 0
          while i < len(letters):
              x = letters[i]
              if x in "aAeEiIoOuU":
                  del letters[i]
              else:
                  i += 1
          return "".join(letters)
      

      【讨论】:

      • 这不起作用,因为letters = text.split() 将文本拆分为由空格分隔的单词,而不是字母。此外,修改您正在迭代的内容通常是一个坏主意。
      • 保留text.split(),这仅在字符串在每个字符之间包含空格时才有效。
      • if x in "aAeEiIoOuU": 会更简洁。
      【解决方案5】:

      您可以使用列表推导并创建类似的内容

      def anti_vowel2(text):
          return "".join([x for x in text if x.lower() not in 'aeiou'])
      
      print(anti_vowel2("test"))
      

      输出字符串tst

      【讨论】:

      • 您可以将那个长谓词重构为简单的if x.lower() not in 'aeiou'
      猜你喜欢
      • 2021-12-16
      • 2018-10-15
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多