【发布时间】:2011-05-26 15:47:53
【问题描述】:
我得到了一个对象列表,这些对象看起来像字符串,但不是真正的字符串(想想 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" ]
我对这样的数据结构实现、名称或任何提示有任何想法。
【问题讨论】:
-
"我当然不想做"".join(x) 会合并所有字符串?"为什么不? “在我的情况下,读取字符串太贵了”这与任何事情有什么关系?什么 - 确切地说 - 连接有问题?
-
因为列表中的字符串并不是真正的字符串。它们是(某种)mmap'ed 文件。但它们就像字符串一样工作(它们实现了
__getitem__)。 -
x[4] == e 因为
__getitem__在x类(列表的子类)中被重载。 -
@Woot4Moo:如果您将所有字符串合并为一个,则“e”位于索引 4。
-
@jd_:“列表中的字符串并不是真正的字符串”。那么请修正问题以说明真正是什么。现在,这个问题具有误导性。
标签: python algorithm data-structures