为什么在python中拆分字符串后不能直接调用remove?

时间:2014-06-13 22:16:41

标签: python-2.7 typeerror

我想从字符串中删除子字符串,例如“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”的列表“?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

已经回答here

来自pythondocs

的引用
  

您可能已经注意到,插入,删除或排序只修改列表的方法没有打印返回值 - 它们返回默认的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")



列表理解

现在,对于聪明的列表操作(它甚至比循环更快),pythonians发明了一个名为list comprehension的不同特性。您可以在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")

此外,您可以谷歌搜索生成器或查看pythondocs。但是我不太了解这一点。

顺便说一下,作为一个菜鸟把我点燃了,但是当他们把python称为初学者语言时我讨厌它,因为上面的列表理解看起来很简单,对初学者来说可能是令人生畏的,不能吗?