你知道是否有一个提供可变字符串的Python库吗?Google返回的结果令人惊讶地很少。我找到的唯一可用的库是http://code.google.com/p/gapbuffer/,但它是用C编写的,我更希望它是用纯Python编写的。
编辑:感谢回复,但我需要一个高效的库。也就是说,''.join(list)
可能有效,但我希望能够更加优化。此外,它必须支持常规字符串所支持的内容,例如正则表达式和unicode。
你知道是否有一个提供可变字符串的Python库吗?Google返回的结果令人惊讶地很少。我找到的唯一可用的库是http://code.google.com/p/gapbuffer/,但它是用C编写的,我更希望它是用纯Python编写的。
编辑:感谢回复,但我需要一个高效的库。也就是说,''.join(list)
可能有效,但我希望能够更加优化。此外,它必须支持常规字符串所支持的内容,例如正则表达式和unicode。
在Python中,可变序列类型为bytearray,请参见此链接
bytearray
显然如其名,是一个字节数组。字符串不是字节序列,而是字节组的序列。也就是说,这仅适用于 ASCII 字符串,对于 Unicode 不适用。-1。 - freakish这将使您能够高效地更改字符串中的字符,尽管您无法更改字符串的长度。
>>> import ctypes
>>> a = 'abcdefghijklmn'
>>> mutable = ctypes.create_string_buffer(a)
>>> mutable[5:10] = ''.join( reversed(list(mutable[5:10].upper())) )
>>> a = mutable.value
>>> print `a, type(a)`
('abcdeJIHGFklmn', <type 'str'>)
len()
时包括终止符。这会破坏具有负索引的切片,除非您对每个负索引都添加一个额外的-1
。(对于Unicode缓冲区也是如此,因为这些类型的len
和切片索引以字符为单位。) - ivan_pozdeevclass MutableString(object):
def __init__(self, data):
self.data = list(data)
def __repr__(self):
return "".join(self.data)
def __setitem__(self, index, value):
self.data[index] = value
def __getitem__(self, index):
if type(index) == slice:
return "".join(self.data[index])
return self.data[index]
def __delitem__(self, index):
del self.data[index]
def __add__(self, other):
self.data.extend(list(other))
def __len__(self):
return len(self.data)
还有其他方法,比如可以创建StringIO、buffer或bytearray的子类。
find
,您需要从object
而不是str
进行子类化。 - chtenbfind
只能在原始字符串上工作。通过 __setitem__
进行的修改将被忽略。是否有办法在可变字符串上使用正则表达式? - chtenbre.match(expression, repr(mutable_string))
。 - Joel Cornettstr
API是否有任何差异。 - toolforgerlist
(Python中可变性的主要示例)进行子类化?class CharList(list):
def __init__(self, s):
list.__init__(self, s)
@property
def list(self):
return list(self)
@property
def string(self):
return "".join(self)
def __setitem__(self, key, value):
if isinstance(key, int) and len(value) != 1:
cls = type(self).__name__
raise ValueError("attempt to assign sequence of size {} to {} item of size 1".format(len(value), cls))
super(CharList, self).__setitem__(key, value)
def __str__(self):
return self.string
def __repr__(self):
cls = type(self).__name__
return "{}(\'{}\')".format(cls, self.string)
s = "te_st"
c = CharList(s)
c[1:3] = "oa"
c += "er"
print c # prints "toaster"
print c.list # prints ['t', 'o', 'a', 's', 't', 'e', 'r']
s = "test"
c = CharList(s)
c[1] = "oa"
# with custom __setitem__ a ValueError is raised here!
# without custom __setitem__, we could go on:
c += "er"
print c # prints "toaster"
# this looks right until here, but:
print c.list # prints ['t', 'oa', 's', 't', 'e', 'r']
FIFOStr 是一个支持模式匹配和可变字符串的 pypi 包。它可能并不完全符合要求,但是它是作为串口模式解析器的一部分而创建的(字符从左侧或右侧逐个添加 - 请参见文档)。它源自 deque。
from fifostr import FIFOStr
myString = FIFOStr("this is a test")
myString.head(4) == "this" #true
myString[2] = 'u'
myString.head(4) == "thus" #true
(完全公开,我是FIFOstr的作者)
在Python中,高效的可变字符串是数组。
使用标准库中的array.array
,以下是unicode字符串的PY3示例:
>>> ua = array.array('u', 'teststring12')
>>> ua[-2:] = array.array('u', '345')
>>> ua
array('u', 'teststring345')
>>> re.search('string.*', ua.tounicode()).group()
'string345'
bytearray
是针对字节预定义的,更加自动化,涉及转换和兼容性。
对于某些情况,您还可以考虑使用memoryview
/buffer
、numpy
数组、mmap
和multiprocessing.shared_memory
。
array
自3.3版本起已被弃用,并将在4.0版本中移除。我非常怀疑,由于固定的项目大小,它无法正确处理代理对。 - undefinedoriginal_string = "hey all"
def get_string():
return original_string
get_string().split()
只需要这样做
string = "big"
string = list(string)
string[0] = string[0].upper()
string = "".join(string)
print(string)
'''输出'''
> Big
''.join(list)
更有效的解决方法。他还特别要求Python提供可变字符串的库(或其他方法以实现它)。- 请修改您的答案并解释为什么从您的角度来看以这种方式进行仍然是有价值的。为未来的读者提供解释而不仅仅是“这样做”。请参见贡献指南作为参考。 - Ivo Mori