Что вы, вероятно, имели в виду
Хотя есть и другие ответы, я хотел поработать над чем-то в соответствии с вашим кодом. Возможно, это не самый эффективный вариант, но я считаю, что это именно то, что вы имели в виду:
my_list = [2, 9, 15, 36, 36, 3, 2, 36]
maximum = max(my_list)
minimum = min(my_list)
first_maximum_index = my_list.index(maximum)
last_minimum_index = len(my_list)-1 - my_list[::-1].index(minimum)
if first_maximum_index <= last_minimum_index:
print("Yes!")
.index()
получает индекс первого значения в списке. Итак, чтобы получить последнее минимальное значение, вам нужно перевернуть список перед использованием .index()
, что является этой частью:
my_list[::-1].index(minimum)
После этого вы получите индекс минимального значения, НО это индекс обратного списка. Теперь вам нужно «перевернуть» этот индекс, вычтя количество индексов, len(my_list)-1
, что даст вам окончательное выражение:
len(my_list)-1 - my_list[::-1].index(minimum)
После этого вы можете сравнить индексы, как вы это делали.
Более эффективный метод
Теперь вот более эффективное решение (хотя и более длинное и, возможно, менее читаемое). Если вы заметили, вы просматриваете список примерно 4 раза (худший случай) в приведенном выше коде. Вы можете сократить его до однократного прохождения списка:
my_list = [2, 9, 15, 36, 36, 3, 36]
# Step 1
current_min = float("inf")
current_max = float("-inf")
is_before = False
for val in my_list:
if val > current_max:
is_before = False
current_max = val
if val <= current_min:
current_min = val
is_before = True
if is_before:
print("Yes!")
Уловка здесь состоит в том, чтобы подумать о подмножествах списка:
[2] # ???
[2, 9] # False
[2, 9, 15] # False
[2, 9, 15, 36] # False
[2, 9, 15, 36, 36] # False
[2, 9, 15, 36, 36, 3] # False
[2, 9, 15, 36, 36, 3, 2] # True
[2, 9, 15, 36, 36, 3, 2, 36] # True
Если вы внимательно посмотрите, результат изменится с От True
до False
при новом максимальном значении. Аналогичным образом результат изменяется с False
на True
, когда в конце списка вводится новое или существующее минимальное значение.
Они соответствуют блоку кода:
# If value introduced is the new maximum
if val > current_max:
is_before = False
current_max = val
# If value introduced is an existing or new minimum
if val <= current_min:
current_min = val
is_before = True