【问题标题】:Python function to modify stringPython函数修改字符串
【发布时间】:2018-04-01 17:29:03
【问题描述】:

我曾经被要求创建一个函数,给定一个字符串,从字符串中删除几个字符。

在 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 中做到这一点?如果是,我可以不复制字符串吗?

【问题讨论】:

  • 字符串是不可变的...所以 no.
  • 我可以创建另一个字符串,但至少将它绑定到同一个变量吗?
  • Python 没有 ref 调用。再说一遍,不。
  • @ABDULNIYASPM ,这会导致像 'abca' 这样的情况出现问题,根据您的方法,它将返回 bc
  • @ABDULNIYASPM :您可以做的一件事是通过reversing 字符串,删除one 元素,然后将reverse 返回。像这样:s[::-1].replace(s[-1],'',1)[::-1]

标签: python string python-2.7


【解决方案1】:

字符串是immutable,因此您唯一的主要选择是通过slicingassign 创建一个new string

#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'

【讨论】:

  • 这样做的问题是,如果你在一个函数内部,你必须返回字符串,所以你把它作为输入参数和输出参数;不完全优雅;或者,您可以建立一个列表并稍后将其转换为字符串
【解决方案2】:

字符串是不可变的,这意味着您不能更改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本身。

【讨论】:

  • 这正是我所期待的解决方案。
【解决方案3】:

您可以删除部分字符串并将其分配给另一个字符串:

s = 'abc'
s2 = s[1:]
print(s2)

【讨论】:

    【解决方案4】:

    你不会那样做......你仍然可以连接但你不会弹出直到它转换成一个列表......

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

    【讨论】:

      【解决方案5】:

      您可以改用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 的一个实例。您真的需要首先将字符串静音吗?

      【讨论】:

      • 我认为这比使用列表要好。是否可以将其转换回字符串?
      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2013-05-11
      • 2021-06-28
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多