Ну начнем с того, что ваша программа некорректна.
Код:
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 -> количество предыдущих/следующих индексов" нужно строить. Это двоичное дерево с подсчетом в узле веса всего "поддерева".