Более короткий способ инкремента min или max значения

Рейтинг: 1Ответов: 1Опубликовано: 14.05.2023

Очень часто бывает так, что нужно добавить 1 к минимальному значению, или отнять 1 от максимального. Яркий пример этому - два указателя, которые двигаются друг к другу.

Возьмём как пример ситуацию:

# Инициализируем два указателя и будем их постепенно двигать друг к другу
heights = [1, 8, 6, 2, 5, 4, 8, 3, 7]
left = 0
right = len(height) - 1

while left < right:
    if heights[left] > heights[right]:
        right -= 1
    else:
        left += 1

В цикле while логика += 1 и -= 1 реализована на 4 строчках, почему мы не можем сделать например так?

min(left, right) += 1
max(left, right) -= 1

Ведь если мы посмотрим на адрес в памяти у этих переменных, то увидим что у left (минимального значения) и функции min от левого и правого указателя одинаковые адреса

print(hex(id(left))) -> 0x956e00 (одинак)
print(hex(id(right))) -> 0x956e20
print(hex(id(min(left, right)))) -> 0x956e00 (одинак)

Что должно в теории разрешать подобные операции во втором блоке с кодом.

Есть ли более короткие альтернативы, которые делают тоже самое, но занимают меньше строк или может быстрее работают?

Ответы

▲ 0Принят

Так и не смог понять, что-же на самом деле интересует ТС. Но основываясь на комментарии, который содержит вот этот вопрос:

Как пример можно рассмотреть список целых чисел, возьмём [1, 9, 2, 5, 6, 1, 2, 4]. Нужно найти индекс с наибольшим значением и увеличить значение на 1. Можно ли сделать коротко, желательно без цикла for или условий?

отвечаю на него. Можно.

Если у вас действительно список, то например, вот так:

lt=[1, 9, 2, 5, 6, 1, 2, 4]
ind_lt_max=lt.index(max(lt))
print(ind_lt_max+1, lt[ind_lt_max+1])

Если у вас еще и массив numpy - то еще проще:

nl=np.array(lt)
ind_nl_max = np.argmax(nl)
print(ind_nl_max+1,nl[ind_nl_max+1])

В обоих случаях выводится "2 2" - индекс элемента, следующего за максимальным в списке (массиве) и само значение, найденное по этому индексу. Как и просили. Коротко, без циклов и условий.

Одно добавление. Как человек, которые проработал почти два десятка лет на С++ прежде чем перейти на Python - мне понятен шок разработчика :-), привыкшего работать с указателями, и не найдя их в Python. Потом приходит понимание, что это никак не сказывается на выразительных возможностях языка - просто думать программисту надо не на языке С++, а на языке Python. Только и всего.