Python函数修改字符串

时间:2017-10-20 14:04:57

标签: python string python-2.7

我曾被要求创建一个给出字符串的函数,从字符串中删除一些字符。

是否可以在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做到这一点,问题就更多了吗?如果是,我可以不复制字符串吗?

5 个答案:

答案 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'

警告

  • 如果您打算过滤任意文本(即非纯ASCII),这是非常糟糕的想法,可以使用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'
>>>