class LookupOnce:

    def __init__(self, seq):
        self.cache = {}
self.seq = iter(seq)

def get(self, key):
    if key in self.cache:
        value = self.cache[key]
del self.cache[key]
return value
for v, k in self.seq:
    if k == key:
        return v
self.cache[k] = v
raise KeyError

def delta(a, b):
    rank_a = LookupOnce(enumerate(a))
rank_b = enumerate(b)
result = {}
for i, k in rank_b:
    result[k] = i - rank_a.get(k)
return result
Быстрый алгоритм для вычисления дельты двух списков