你可能想到的
虽然还有其他答案,但我想按照您的代码行做一些事情。它可能不是最有效的,但我相信这是您的想法:
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