inserting bracketings into a string

Eddie Corns eddie at holyrood.ed.ac.uk
Wed Nov 17 06:53:49 EST 2004


Steven Bethard <steven.bethard at gmail.com> writes:

>I'm trying to insert some bracketings in a string based on a set of
>labels and associated start and end indices.  For example, I'd like to
>do something like:

>>>> text = 'abcde fgh ijklmnop qrstu vw xyz'
>>>> spans = [('A', 0, 9), ('B', 6, 9), ('C', 25, 31)]
>>>> insert_bracketings(text, spans)
>'[A abcde [B fgh]] ijklmnop qrstu [C vw xyz]'

>My current implementation looks like:

>>>> def insert_bracketings(text, spans):
>... 	starts = [start for _, start, _ in spans]
>... 	ends = [end for _, _, end in spans]
>... 	indices = sorted(set(starts + ends))
>... 	splits = [(text[start:end], start, end)
>... 	          for start, end in zip([None] + indices, indices + [None])]
>... 	start_map, end_map = {}, {}
>... 	for label, start, end in spans:
>... 		start_map.setdefault(start, []).append('[%s ' % label)
>... 		end_map.setdefault(end, []).append(']')
>... 	result = []	
>... 	for string, start, end in splits:
>... 		if start in start_map:
>... 			result.extend(start_map[start])
>... 		result.append(string)
>... 		if end in end_map:
>... 			result.extend(end_map[end])
>... 	return ''.join(result)
>... 

>but it seems like there ought to be an easier way.  Can anyone help me?

def insert_bracketings (txt, spans):
    text = list(txt)
    for tg,start,end in spans:
        text[start] = '[%s %s'%(tg,text[start])
        text[end-1] = '%s]'%text[end-1]
    return ''.join(text)

print insert_bracketings('abcde fgh ijklmnop qrstu vw xyz',[('A', 0, 9), ('B', 6, 9), ('C', 25, 31)])

Might not give what you expect if two spans start at the same place but you
haven't defined that.

Eddie



More information about the Python-list mailing list