I think the accepted answer is great, but why don't you do it explicitly? I feel more people would understand your code, and that is in agreement with PEP 8:
max_value = max(my_list) max_index = my_list.index(max_value)
This method is also about three times faster than the accepted answer:
import random from datetime import datetime import operator def explicit(l): max_val = max(l) max_idx = l.index(max_val) return max_idx, max_val def implicit(l): max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1)) return max_idx, max_val if __name__ == "__main__": from timeit import Timer t = Timer("explicit(l)", "from __main__ import explicit, implicit; " "import random; import operator;" "l = [random.random() for _ in xrange(100)]") print "Explicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000) t = Timer("implicit(l)", "from __main__ import explicit, implicit; " "import random; import operator;" "l = [random.random() for _ in xrange(100)]") print "Implicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
Results as they run in my computer:
Explicit: 8.07 usec/pass Implicit: 22.86 usec/pass
Other set:
Explicit: 6.80 usec/pass Implicit: 19.01 usec/pass