我想从字符串中删除子字符串,例如“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”的列表“?
答案 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称为初学者语言时我讨厌它,因为上面的列表理解看起来很简单,对初学者来说可能是令人生畏的,不能吗?