在给定索引列表的情况下删除大字符串的一部分

时间:2013-05-25 20:44:37

标签: python

看起来像一个简单的问题,但有一个字符串(巨大的,来自一个大文件), 如何在一对索引(实际上是一对索引列表)之间删除部分字符串

例如removeByIndex("Text aaa bbb", [(0,1), (5, 9)])会返回 ext bbb

索引不重叠。

它必须高效,因为内容相对较大(高达几百兆)

总结:所以在任何情况下解决方案似乎都涉及创建一个新字符串并手动遍历索引对列表,并添加不在列表中的索引。

4 个答案:

答案 0 :(得分:6)

在你表明它是瓶颈之前不要担心性能

s = s[:i] + s[j:]

如果这还不够快,你就不能使用Python - 或C.你必须选择更好的数据结构

答案 1 :(得分:4)

假设您的对(开始,结束)不包括在内,我会这样做 (我已经嵌入了一个可扩展的测试用例,因此您可以运行一些性能测试):

N = 100000
s = ''.join([ chr(c % 26 + ord('a')) for c in range(N) ])

l = [ (26*i,26*i+3) for i in range(N//26) ]

l.sort(lambda x, y : cmp(x[0], y[0]))

ns = []
i = 0
for (start,end) in l:
    ns.append(s[i:start])
    i = end
ns.append(s[end:])
s = ''.join(ns)

当N = 100 000 000(你的字符串的顺序)时,这个脚本运行不到30秒。它很慢但可能是可以忍受的。当然,正确的数据结构是解决这一特定问题的障碍。因此,如果你需要进行大量的运行,你应该放弃Python或在Python中使用适当的数据结构。

答案 2 :(得分:1)

from itertools import izip
def grouped(iterable, n):
            return izip(*[iter(iterable)]*n)
big_str="12345893483104921420948124"
indexes = [2,4,5,7]
# if needed, indexes = sorted(indexes)
indexes.insert(0, 0)
indexes.append(len(big_str))
sm_str=""
for a,b in grouped(indexes,2):
    sm_str=sm_str+big_str[a:b]

答案 3 :(得分:0)

你需要多快,尝试:

In [9]: import string

In [10]: import random

In [11]: huge=''.join(random.choice(string.lowercase) for x in range(10000))

In [12]: len(huge)
Out[12]: 10000

In [13]: not_sohuge=huge[0:5000]+huge[6000:]

In [14]: len(not_sohuge)
Out[14]: 9000

一些时间:

$ python -m timeit -s 'import random; import string; huge="".join(random.choice(string.lowercase) for x in range(10000))'  'not_sohuge=huge[0:5000]+huge[6000:]'
100000 loops, best of 3: 2.96 usec per loop