Изменчивые строки в Python

Пожалуйста, знаете ли вы о библиотеке Python, которая предоставляет изменяемые строки? Google выдал на удивление мало результатов. Единственная полезная библиотека, которую я нашел, этоhttp: //code.google.com/p/gapbuffer который находится в C, но я бы предпочел, чтобы он был написан на чистом Python.

Ред .: Спасибо за ответы, но я после Эффективной библиотека. То есть,''.join(list) может сработать, но я надеялся на что-то более оптимизированное. Кроме того, он должен поддерживать обычные вещи, которые делают обычные строки, такие как regex и unicode.

Ответы на вопрос(4)

class 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, буфер или 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'>)

ByteArray видетьэта ссылк

Как насчет простого подклассаlist (главный пример изменчивости в 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']

Следующее исправлено, см. Обновление ниже.

Есть одно (решаемое) предупреждение: нет проверки (пока) того, что каждый элемент действительно является символом. По крайней мере, он не сможет печатать все, кроме строк. Тем не менее, они могут быть объединены и могут вызвать странные ситуации, подобные этой: [см. Пример кода ниже]

С обычаем__setitem__, присвоение строки длины! = 1 элементу CharList подниметValueError. Все остальное все еще может быть свободно назначено, но подниметTypeError: sequence item n: expected string, X found при печати из-заstring.join() операция. Если этого недостаточно, можно легко добавить дополнительные проверки (потенциально также в__setslice__ или переключив базовый класс наcollections.Sequence (производительность может отличаться ?!), ср.Во)

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

ВАШ ОТВЕТ НА ВОПРОС