用于可转换字符串列表的Python数据结构

时间:2011-05-26 15:47:54

标签: python algorithm data-structures

我有一个看起来像字符串的对象列表,但不是真正的字符串(想想mmap的文件)。像这样:

x = [ "abc", "defgh", "ij" ]

我想要的是x可以直接索引,就​​像它是一个大字符串,即:

(x[4] == "e") is True

(当然我不想做“”.join(x)会合并所有字符串,因为在我的情况下读取字符串太贵了。记住它是mmap的文件。)。

如果遍历整个列表,这很容易,但似乎是O(n)。所以我通过创建这样的列表更有效地实现了__getitem__

x = [ (0, "abc"), (3, "defgh"), (8, "ij") ]

因此,我可以在__getitem__中进行二进制搜索,以快速找到具有正确数据的元组,然后索引其字符串。这很有效。

我看到如何实现__setitem__,但它看起来很无聊,我想知道是否已经没有那样做了。

更准确地说,这就是数据结构应该如何表达__setitem__

>>> x = [ "abc", "defgh", "ij" ]
>>> x[2:10] = "12345678"
>>> x
[ "ab", "12345678", "j" ]

我对这样的数据结构实现,名称或任何提示都有所了解。

5 个答案:

答案 0 :(得分:9)

您所描述的是rope data structure的特殊情况。

不幸的是,我不知道任何Python实现。

答案 1 :(得分:0)

您已重新创建字典数据类型。

答案 2 :(得分:0)

所以你仍然希望能够解决第n个列表元素,比如找x.somemethod(2) == 'ij'? 如果没有,那么您的数据结构只是一个字符串,其中包含一些使其可变的方法,并从字符串列表中初始化它。

如果您希望能够这样做,那么您的数据结构仍然是包含这些额外方法的字符串,另外还有一个元素用于跟踪其元素来自的范围,例如x.camefrom(1) == (3, 7)

无论哪种方式,您似乎都希望存储和操作字符串。

答案 3 :(得分:0)

这可能是一个开始:

self._h = {0:"abc", 3:"defgh", 8:"ij"} #create _h and __len__ in __init__
self.__len__ = 10

def __getitem__(i):
    if i >= self.__len__:
        raise IndexError
    o=0
    while True:
        if i-o in self._h:
            return self._h[i-o][o]
        o+=1

改进包含可变性。

答案 4 :(得分:0)

我不知道有什么可以做你想要的。

但是,如果您按照您的说法有效地实现了__getitem__,那么您已经拥有了将索引映射到元组字符串列表的代码。因此,您似乎可以重用那段代码 - 稍加重构 - 来实现需要相同信息来执行其功能的__setitem__