def nearestGreater(a): b = [-1] * len(a) # create sorted pairs of indices and values; since sort is stable # it allows to simplify choosing the correct item. pairs = sorted(enumerate(a), key=lambda pair: pair[1]) for i, pair in enumerate(pairs): neighbor = min( pairs[i + 1:], key=lambda p: abs(p[0] - pair[0]) if p[1] != pair[1] else pairs[-1][0], default=None) if neighbor: b[pair[0]] = neighbor[0] return b