Índice de elemento mínimo de uma lista

Calcular o elemento mínimo de uma lista é uma tarefa muito comum em programação. Em Python, calcula-se o mínimo de uma lista com a função integrada min.

Agora, e se, além do valor de um elemento mínimo, também precisarmos calcular um índice de tal elemento na lista? Como podemos fazer isso sem escrever loops explícitos, em uma linha, usando a mesma minfunção?

Aqui está uma linha que fornece o valor do mínimo e também o primeiro índice onde ele é realizado:

>>> l = [33, 788, 1, -14, 78, 11, 32, 11, 78, -1, -14]
>>> mn,idx = min( (l[i],i) for i in xrange(len(l)) )
>>> mn,idx
(-14, 3)

A razão pela qual isso funciona é porque a ordem padrão das tuplas em Python é lexicográfica , com o componente mais significativo à esquerda.

Desnecessário dizer que a dica também se aplica ao cálculo do elemento máximo, com a maxfunção embutida.

O truque é bastante geral e, portanto, deve generalizar para linguagens com funcionalidade semelhante em tuplas e listas.

Aproveitar!