# 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

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

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).