def nearestGreater(a): l = len(a) sorted_a = sorted(enumerate(a), key=lambda x: x[1], reverse=True) def indexes_to_check(index): check_left = index - 1 check_right = index + 1 while (check_left >= 0) or (check_right < l): if check_left >= 0: yield check_left check_left -= 1 if check_right < l: yield check_right check_right += 1 def get_nearest_greater(index): for j in indexes_to_check(index): if a[j] > a[i]: return j return -1 return [get_nearest_greater(i) for i in range(0, len(a))]