2013-05-25 2 views
-1

간단한 질문처럼 보이지만 큰 파일에서 오는 거대한 문자열 인 색인의 쌍 사이에서 문자열 부분을 제거하는 방법 (실제로 예를 removeByIndex("Text aaa bbb", [(0,1), (5, 9)])를 들어 인덱스 쌍)큰 목록에서 색인 목록을 삭제하면

의 목록은 인덱스가 중복되지 ext bbb

을 반환합니다.

그것은 내용이

요약 (몇 메가 수백까지) 상대적으로 큰 있기 때문에 효율적이어야한다

: 그래서 솔루션은 인덱스 쌍의리스트를가는 수동으로 새 문자열을 만들고 참여 보인다 어떤 경우에 , 목록에없는 색인을 추가하십시오.

이 충분히 빨리 파이썬을 사용할 수 없습니다 만약 당신이 병목

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

있다고 표시했습니다 때까지

+2

예를 들어, 몇 가지 코드를 보여주십시오. – enginefree

+3

크기는 얼마나 큽니까? – Blender

+0

은 합법적 인 문자열 (ASCII/UNICODE) 또는 바이트 문자열입니까? – PSS

답변

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에서 적절한 데이터 구조를 사용해야합니다.

+1

프로그램이 O (N^2)이므로 느립니다. http://www.skymind.com/~ocrow/python_string/ 수정하려면'ns = []'을 만들고 끝에 '' '.join (ns)' – jamylak

+1

고마워요! 나는 나의 포스트를 편집했고 당신은 나의 하루를 보냈다. – deufeufeu

+0

사실,이 경우에는별로 변하지 않습니다. 제한 요소는 슬라이싱 및 연결입니다. 연결을 개선해도 느린 슬라이스를 보충하지 못합니다. – deufeufeu

6

성능에 대해 걱정하지 마십시오 - 또는 C. 당신은 더 나은 자료 구조를 선택해야합니다

+4

주의 할 점은 이렇게하면 색인을 어길 수 있습니다. 따라서 제거 할 쌍은 첫 번째 삭제 이후에 유효하지 않습니다. – deufeufeu

+1

@deufeufeu, 문자열을 반복해서 다시 작성할 필요가 없습니다. 쌍을 이루는 인덱스를 정렬하여 생성자 표현식과'.join()'을 사용할 수 있도록 정렬해야합니다. –

+0

예, 여러 인덱스의 경우이를 깨뜨릴 것입니다 – Ivan

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 

일부 타이밍 :

당신의 쌍 것을 가정하면 0,533,210
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] 
+0

니스 ,,,,,,,,,,,,,,,,,, – Ivan

관련 문제