Эффективный способ хранения кортежей разностной информации без избыточности
У меня есть этот основной текст How can I run java script from a local folder?
этот diff.diff_main(diff(), "How can I run java script from a local folder?","How can I run Javascript from a local folder?")
возвращается [(0, 'How can I run '), (-1, 'j'), (1, 'J'), (0, 'ava'), (-1, ' '), (0, 'script from a local folder?')]
это не очень большая проблема с этой короткой строкой, но это с большими строками, такими как 40000 символов, что часто встречается в моем приложении. Я выбираю эту короткую строку для ясности и читабельности, однако я ищу способ сохранить текстовые позиции (от начальной позиции до конечной позиции) вместо реального текста. это будет наконец соответствовать исходному тексту.
пример,, вместо [(0, 'How can I run '), (-1, 'j'), (1, 'J'), (0, 'ava'), (-1, ' '), (0, 'script from a local folder?')]
у меня будет [(0, '0,14'), (-1, 'j'), (1, 'J'), (0, '15,18'), (-1, ' '), (0, '19,44')]
он будет декодирован из позиций, закодированных в кортежах, например 0,14 - из позиции от 0 до 14 или How can I run
,,, 15,18 с позиции 15 до 18 в исходном тексте или ava
и так далее,,
это может быть восстановлено, как это originaltext[0:14]
потом,,,
Я пытался с этим это очень близко
a=[(0, 'How can I run '), (-1, 'j'), (1, 'J'), (0, 'ava'), (-1, ' '), (0, 'script from a local folder?')]
b='How can I run java script from a local folder?'
result={}
positioncount = 0
for x, y in enumerate(a):
if y[0] == 0:
if positioncount == 0:
result[x]={y[0]:len(y[1])}
positioncount+=len(y[1])
else:
result[x]={y[0]:(len(y[1])+positioncount,len(y[1]))}
else:
result[x]={y[0]:y[1]}
positioncount-=len(y[1])
но print result
это дай мне {0: {0: 14}, 1: {-1: 'j'}, 2: {1: 'J'}, 3: {0: (15, 3)}, 4: {-1: ' '}, 5: {0: (38, 27)}}
и не правильно, потому что это должно дать {0: {0: 14}, 1: {-1: 'j'}, 2: {1: 'J'}, 3: {0: (15, 18)}, 4: {-1: ' '}, 5: {0: (19, 44)}}
что я тут делаю не так? в любом случае, чтобы сделать это правильно? Если у вас есть какая-либо альтернатива, я рад принять ее в благодарность!
1 ответ
Почему вы создаете словари с запущенными индексами в качестве ключей? Попробуй это:
a=[(0, 'How can I run '), (-1, 'j'), (1, 'J'), (0, 'ava'), (-1, ' '), (0, 'script from a local folder?')]
b='How can I run java script from a local folder?'
result = []
position = 0
for v, txt in a:
if v == 0:
result.append((0, (position, position+len(txt))))
else:
result.append((v, txt))
if v<=0:
position += len(txt)