Getting the index of the returned max or min item using max()/min() on a list Getting the index of the returned max or min item using max()/min() on a list python python

# Getting the index of the returned max or min item using max()/min() on a list

Say that you have a list `values = [3,6,1,5]`, and need the index of the smallest element, i.e. `index_min = 2` in this case.

Avoid the solution with `itemgetter()` presented in the other answers, and use instead

``index_min = min(range(len(values)), key=values.__getitem__)``

because it doesn't require to `import operator` nor to use `enumerate`, and it is always faster(benchmark below) than a solution using `itemgetter()`.

If you are dealing with numpy arrays or can afford `numpy` as a dependency, consider also using

``import numpy as npindex_min = np.argmin(values)``

This will be faster than the first solution even if you apply it to a pure Python list if:

• it is larger than a few elements (about 2**4 elements on my machine)
• you can afford the memory copy from a pure list to a `numpy` array

as this benchmark points out: I have run the benchmark on my machine with python 2.7 for the two solutions above (blue: pure python, first solution) (red, numpy solution) and for the standard solution based on `itemgetter()` (black, reference solution).The same benchmark with python 3.5 showed that the methods compare exactly the same of the python 2.7 case presented above

``if is_min_level:    return values.index(min(values))else:    return values.index(max(values))``

You can find the min/max index and value at the same time if you enumerate the items in the list, but perform min/max on the original values of the list. Like so:

``import operatormin_index, min_value = min(enumerate(values), key=operator.itemgetter(1))max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))``

This way the list will only be traversed once for min (or max). 