Самый простой способ будет:
topX = sorted([x for x in array if x > lowValY], reverse=True)[highCountX-1]
print [x if x >= topX else 0 for x in array]
По частям это выбирает все элементы больше lowValY
:
[x for x in array if x > lowValY]
Этот массив содержит только количество элементов, превышающее пороговое значение. Затем сортируем его так, чтобы самые большие значения были в начале:
sorted(..., reverse=True)
Затем индекс списка принимает порог для верхних highCountX
элементов:
sorted(...)[highCountX-1]
Наконец, исходный массив заполняется с использованием другого понимания списка:
[x if x >= topX else 0 for x in array]
Существует граничное условие, в котором есть два или более равных элемента, которые (в вашем примере) являются третьими по величине элементами. Полученный массив будет содержать этот элемент более одного раза.
Существуют и другие граничные условия, например, len(array) < highCountX
. Обработка таких условий остается за разработчиком.