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