Эффективный способ хранения кортежей разностной информации без избыточности

У меня есть этот основной текст 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)
Другие вопросы по тегам