我曾被要求创建一个给出字符串的函数,从字符串中删除一些字符。
是否可以在Python中执行此操作?
这可以对列表进行,例如:
def poplist(l):
l.pop()
l1 = ['a', 'b', 'c', 'd']
poplist(l1)
print l1
>>> ['a', 'b', 'c']
我想要的是为字符串执行此功能。 我能想到的唯一方法是将字符串转换为列表,删除字符然后将其连接回字符串。但是我必须返回结果。 例如:
def popstring(s):
copys = list(s)
copys.pop()
s = ''.join(copys)
s1 = 'abcd'
popstring(s1)
print s1
>>> 'abcd'
我理解为什么这个功能不起作用。如果可以用Python做到这一点,问题就更多了吗?如果是,我可以不复制字符串吗?
答案 0 :(得分:3)
字符串为immutable
,因此您唯一的主要选择是new string
创建一个slicing
,然后再assign
。
#removing the last char
>>> s = 'abcd'
>>> s = s[:-1]
=> 'abc'
另一个易于使用的方法可能是使用list
然后使用join
中的元素来创建字符串。当然,这一切取决于您的偏好。
>>> l = ['a', 'b', 'c', 'd']
>>> ''.join(l)
=> 'abcd'
>>> l.pop()
=> 'd'
>>> ''.join(l)
=> 'abc'
如果您希望删除某个索引处的字符,请pos
(此处为索引0),您可以slice
字符串为:
>>> s='abcd'
>>> s = s[:pos] + s[pos+1:]
=> 'abd'
答案 1 :(得分:3)
字符串不可变,这意味着您无法更改str
对象。你当然可以构造一个新字符串,它是对旧字符串的一些修改。但是,您不能改变代码中的s
对象。
解决方法可能是使用容器:
class Container:
def __init__(self,data):
self.data = data
然后popstring
给出一个包含,它检查容器,并将其他东西放入其中:
def popstring(container):
container.data = container.data[:-1]
s1 = Container('abcd')
popstring(s1)
但是又一次:你没有更改字符串对象本身,你只是在容器中添加了一个新字符串。
您无法在Python中执行call by reference,因此无法调用函数:
foo(x)
然后更改变量x
:复制x
的引用,因此您无法更改变量x
本身。
答案 2 :(得分:1)
您可以改为使用bytearray
:
s1 = bytearray(b'abcd') # NB: must specify encoding if coming from plain string
s1.pop() # now, s1 == bytearray(b'abc')
s1.decode() # returns 'abc'
警告:
bytearray
顺便说一句,也许它是XY problem
的一个实例。你真的需要首先将字符串静音吗?
答案 3 :(得分:0)
您可以删除部分字符串并将其分配给另一个字符串:
s = 'abc'
s2 = s[1:]
print(s2)
答案 4 :(得分:0)
你不会这样做..你仍然可以连接但你不会弹出,直到它转换成一个列表..
>>> s = 'hello'
>>> s+='world'
>>> s
'helloworld'
>>> s.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'pop'
>>> list(s).pop()
'd'
>>>
但你仍然可以玩切片
>>> s[:-1]
'helloworl'
>>> s[1:]
'elloworld'
>>>