S
Steven Bethard
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:
My current implementation looks like:
.... 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?
Thanks in advance,
Steve
labels and associated start and end indices. For example, I'd like to
do something like:
'[A abcde [B fgh]] ijklmnop qrstu [C vw xyz]'text = 'abcde fgh ijklmnop qrstu vw xyz'
spans = [('A', 0, 9), ('B', 6, 9), ('C', 25, 31)]
insert_bracketings(text, spans)
My current implementation looks like:
.... 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?
Thanks in advance,
Steve