【问题标题】:why cannot invoke remove directly after split a string in python?为什么在python中拆分字符串后不能直接调用remove?
【发布时间】:2014-08-04 13:19:18
【问题描述】:

我想从一个字符串中删除一个子字符串,例如“a,b,c”中的“a”然后返回“b,c”给我,不管a在字符串中的顺序是什么(如 "a,b,c"、"b,a,c" 等等)。

DELIMITER = ","
def remove(member, members_string):
    """removes target from string"""
    members = members_string.split(DELIMITER)
    members.remove(member)
    return DELIMITER.join(members)

print remove("a","b,a,c")

output: b,c

上述功能按预期工作。

我的问题是我不小心修改了我的代码,它看起来像:

def remove_2(member, members_string):
    """removes target from string"""
    members = members_string.split(DELIMITER).remove(member)
    return DELIMITER.join(members)

你可以看到我修改了

    members = members_string.split(DELIMITER)
    members.remove(member)

    members = members_string.split(DELIMITER).remove(member)

在方法被破坏之后,它会抛出

    Traceback (most recent call last):
      File "test.py", line 15, in <module>
        remove_2("a","b,a,c")
      File "test.py", line 11, in remove_2
        return DELIMITER.join(members)
    TypeError

根据我的理解,members_string.split(DELIMITER) 是一个列表,允许调用remove(),它应该返回新列表并存储到members,但是 当我打印members_string.split(DELIMITER) 时它返回None,它解释了为什么抛出TypeError,我的问题是,为什么它返回None 而不是包含元素“b”和“c”的列表?

【问题讨论】:

    标签: python-2.7 typeerror


    【解决方案1】:

    remove() 不返回任何内容。它会修改它所调用的列表(列表是可变的,因此创建一个新列表会浪费大量 CPU 时间和内存),因此返回相同的列表将毫无意义。

    【讨论】:

      【解决方案2】:

      这已经回答here

      引用自pythondocs

      您可能已经注意到,仅修改列表的 insert、remove 或 sort 等方法没有打印返回值——它们返回默认值 None。这是 Python 中所有可变数据结构的设计原则。

      列表等可变对象可以通过它们的数据操作方法在后台进行操作,例如 remove()、insert()、add()。

      像字符串这样的不可变对象总是从它们的数据操作方法中返回一个自己的副本,比如用 replace() 或 upper()。


      方法链

      下一个示例显示您的预期方法链接适用于字符串:

      # Every replace() call is catching a different case from
      # member_string like
      #    a,b,member
      #    member,b,c
      #    a,member,c
      
      DELIMITER = ","
      
      def remove(member, member_string):
          members = member_string.replace(DELIMITER + member, '').replace(member + DELIMITER, '').replace(DELIMITER + member + DELIMITER, '').upper()
          return members
      
      # puts out B,C
      print remove("a","b,a,c")
      



      列表理解

      现在,为了巧妙的列表操作(它甚至比 for 循环更快),pythonians 发明了一个名为列表理解的不同功能。你可以在python documentation阅读它。

      DELIMITER = ","
      def remove(member, members_string):
          members = [m.upper() for m in members_string.split(DELIMITER) if m != member]
          return DELIMITER.join(members)
      
      # puts out B,C
      print remove("a","b,a,c")
      

      此外,您可以在 Google 上搜索生成器或查看 pythondocs。但对此了解不多。

      顺便说一句,我是个菜鸟,但我讨厌他们称 python 为初学者语言,因为上面的列表理解看起来很容易,对初学者来说可能会很吓人,不是吗?

      【讨论】:

        猜你喜欢
        • 2011-12-29
        • 1970-01-01
        • 2012-03-11
        • 2017-06-28
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        相关资源
        最近更新 更多