Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的可变字符串_Python_String_Mutable - Fatal编程技术网

Python中的可变字符串

Python中的可变字符串,python,string,mutable,Python,String,Mutable,请问,您知道提供可变字符串的Python库吗?谷歌的结果出人意料地少。我发现唯一可用的库是用C编写的,但我更喜欢用纯Python编写 编辑:谢谢你的回复,但我想要一个高效的图书馆。也就是说,'.join(list)可能会起作用,但我希望有更优化的东西。此外,它还必须支持常规字符串的常用功能,如正则表达式和unicode。在Python中,可变序列类型是bytearray请参见 。。。 等等,等等 您还可以将StringIO、buffer或bytearray子类化。这将允许您有效地更改字符串中的字

请问,您知道提供可变字符串的Python库吗?谷歌的结果出人意料地少。我发现唯一可用的库是用C编写的,但我更喜欢用纯Python编写


编辑:谢谢你的回复,但我想要一个高效的图书馆。也就是说,
'.join(list)
可能会起作用,但我希望有更优化的东西。此外,它还必须支持常规字符串的常用功能,如正则表达式和unicode。

在Python中,可变序列类型是bytearray请参见

。。。 等等,等等


您还可以将StringIO、buffer或bytearray子类化。

这将允许您有效地更改字符串中的字符。虽然不能更改字符串长度

>>> 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'>)
>>导入ctypes
>>>a='abcdefghijklmn'
>>>可变=类型。创建字符串缓冲区(a)
>>>可变[5:10]=''.join(反向(列表(可变[5:10].upper()))
>>>a=可变值
>>>打印“a”,键入(a)`
(‘abcdeJIHGFklmn’,)

简单地对
列表进行子分类如何(Python中可变性的主要示例)

仅当您想要打印列表或主动请求字符串表示形式时,才会将列表连接回字符串。 变异和扩展是微不足道的,用户已经知道如何做了,因为它只是一个列表

用法示例:

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']
以下内容已修复,请参阅下面的更新

有一个(可解决的)警告:还没有检查每个元素是否确实是一个字符。除了字符串,它至少无法打印所有内容。但是,这些可以合并,并可能导致如下奇怪的情况:[参见下面的代码示例]

使用自定义的
\uuuu setitem\uuuuu
,分配一个长度为的字符串!=1到一个字符列表项将引发一个
ValueError
。其他所有内容仍然可以自由分配,但由于
string.join()
操作,打印时将引发
TypeError:sequence item n:expected string,X found
。如果这还不够好,可以很容易地添加进一步的检查(也可以添加到
\uuuu setslice\uuuu
或通过将基类切换到
collections.Sequence
(性能可能会有所不同),cf.)


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
是为字节预定义的,在转换和兼容性方面更加自动化

您还可以考虑<代码> >代码> > />代码>缓冲区< /代码>,<代码> NoMPy < /COD>数组,<代码> MMAP和<代码>多重处理。

string=“big”

string=list(string)

string[0]=string[0].upper()

string=”“.加入(字符串)

打印(字符串)

“输出”

>大的

列表在这方面非常有效。有几个链接:,你能解释一下,为什么需要可变字符串吗?用例是什么?@BasicWolf可能用于高效地替换字符串中的字符?我们正在避免创建字符串的副本。@chuwy好吧,有一个bytearray用于这些目的。Python中的字符串本质上不是“内存高效”序列,而是并发高效序列。考虑这一点:您可以始终确信,无论字符串上的字符串修改操作对它没有什么影响。所以,在并发性、线程安全等方面没有问题。我不确定@Marcin指的是什么,因为bytearray允许您为bytearray的一部分分配新值。@jonathanrocher检查编辑历史记录。Marcin指出了一个错误,它被纠正了。这应该是“正确”的答案。在当前的热门投票中有太多的混乱。
bytearray
顾名思义显然是一个字节数组。字符串不是字节序列,而是字节组序列。也就是说,这仅适用于ASCII字符串,而不适用于一般的unicode-1.注意多字节字符。示例:bytearray('aé'。encode('utf8'))bytearray(b'a\xc3\xa9')要能够使用正则表达式和字符串方法,如
find
,您需要从
str
中生成子类,而不是
对象
。更正:正则表达式和
find
仅对原始字符串起作用。通过
\uuuuu setitem\uuuuu
进行的修改将被忽略。有没有一种方法可以在可变字符串上使用正则表达式?您可以执行
re.match(expression,repr(可变字符串))
但也可以使用普通字符串。我想/需要利用这种可变性。请注意,缓冲区将终止符包含在其报告的
len()
中。这将断开具有负索引的切片,除非向每个负索引添加额外的
-1
。(对于unicode缓冲区,它也是
-1
,因为
len
和这些类型的切片索引都是字符。)OP在问题描述中指出,他正在寻找比
''更有效的方法。加入(列表)
。他还特别要求提供一个在Python中提供可变字符串的库(或其他实现方法)请修改你的答案,并从你的角度解释为什么这样做仍然值得。对未来的读者来说,给出解释而不仅仅是这样做更有帮助。另见参考资料。
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']
>>> ua = array.array('u', 'teststring12')
>>> ua[-2:] = array.array('u', '345')
>>> ua
array('u', 'teststring345')
>>> re.search('string.*', ua.tounicode()).group()
'string345'