Показать сообщение отдельно
Старый 19.07.2013, 17:30
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 7  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Ну начнем с того, что ваша программа некорректна.
Код:
    source = [18, 19, 1, 2, 4, 6, 8, 32, 3, 200, 42, 12, 99]
    target = [19, 18, 2, 3, 1, 8, 200, 12, 666, 32, 111, 222, 333, 444, 555]
...
RuntimeError: maximum recursion depth exceeded in cmp
В простейшем варианте все совсем просто. Конвертируем массивы в set, считаем, кто где добавился. Если не хочется set, можно отсортировать и пройтись по массиву.
Код:
def addedHandler(element):
    print("element '" + str(element) + "'\tadded")

def removedHandler(element):
    print("element '" + str(element) + "'\tremoved")

if __name__ == "__main__":
    source = [18, 19, 1, 2, 4, 6, 8, 32, 3, 200, 42, 12, 99]
    target = [19, 18, 2, 3, 1, 8, 200, 12, 666, 32, 111, 222, 333, 444, 555]
    sset = set(source)
    tset = set(target)
    for a in (tset - sset):
      addedHandler(a)
    for r in (sset - tset):
      removedHandler(r)
Если хочется с индексами, то нужно разобраться, что именно выводится. Это последовательность инструкций для построения последовательности или просто "какой индекс был, какой стал".

Ну допустим, есть [1, 2, 3] и [4, 3, 2]. Это что?
Код:
1 removed at 0
3 moved from 1 to 0
4 added at 0
или
Код:
1 removed at 0
3 moved from 2 to 1
2 moved from 1 to 2
4 added at 0
Второй делается тоже просто. Просто начальный/конечный индексы в map нужно хранить и с ним работать. Первый делается гораздо сложнее (если с приемлемой сложностью). Там нужно уметь правильно пересчитывать "все" индексы за приемлемое время. При определенных ограничениях это вроде бы делается за NlogN (где N - количество оставшихся элементов). Там что-то вроде деревьев поиска "index -> количество предыдущих/следующих индексов" нужно строить. Это двоичное дерево с подсчетом в узле веса всего "поддерева".