I think this might work for you.
len(a) - a[::-1].index(max(a)) - 1
a[::-1] is the Pythonic way to reverse the list, and then the index function will find the "first" time that max(a) occurs in the reversed list, which will be the last time it occurs in the original list.
Another way to do it could be:
def last_max_index2(s):
m_index = m = None
for i, elem in enumerate(s):
if elem >= m:
m, m_index = elem, i
return m_index
last_max_index2 has the advantage that it is calculating the max as it goes, and hence only needs one pass over the array. But it's more of an algorithm you would see written in C++ or Java, and less in Python. Often this is correct: the shorter ways that rely on built-ins are better.
However, I think this is a much more readable and intuitive approach than any solution using reduce or a single-liner with enumerate and keys with lambdas. Those solutions will only be readily understandable by very familiar Python programmers.
And a solution like that in the comments is very obfuscated:
last_max_index3 = lambda s: max((x, i) for i, x in enumerate(s))[1]
I know most folks familiar with Python would disagree, but I think this code is so misdirectional to a Python beginner that it's actually harmful to do it this way, regardless of one-liner-ness, use of enumerate, and small number of characters typed.
max((x, i) for i, x in enumerate(a))[1]