删除给定索引列表的大字符串的部分

2024-04-25 19:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

索引没有重叠。你知道吗

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

总结:所以在任何情况下,解决方案似乎都需要创建一个新字符串,手动检查索引对列表,并添加列表中没有的索引。你知道吗


Tags: 文件字符串text内容列表情况手动解决方案
3条回答

假设你的一对(开始,结束)不包含在结尾,我就这样做 (我嵌入了一个可扩展的测试用例,这样您就可以运行一些性能测试):

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=100000(字符串的顺序)时,这个脚本的运行时间不超过30秒。虽然很慢,但可能可以忍受。当然,正确的数据结构是解决这个特殊问题的关键。因此,如果您需要执行大量的运行,您可能应该放弃Python或者在Python中使用适当的数据结构。你知道吗

不要担心性能,除非你已经证明它是一个瓶颈

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

如果速度不够快,就不能使用Python或C语言,必须选择更好的数据结构

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]

相关问题 更多 >