Como encontrar o item em uma lista cujo f (item) é o menor?

10

Eu tenho uma lista le uma função f. fnão está aumentando ou diminuindo estritamente. Como posso encontrar o item da lista que f(item)é o menor? Por exemplo, digamos que a lista seja:

l = [1, 2, 3, 4]

e list(f(x)for x in l)é:

[2, 9, 0, 3]

f(3)é menor que f de qualquer um dos outros, portanto, ele deve imprimir "3". Qual é a maneira mais curta de fazer isso? Eu tentei inicialmente:

min(f(x) for x in l)

Mas isso dá 0, não 3. Se eu estivesse filmando por legibilidade, não por brevidade, eu faria:

index = 0
smallest = f(l[0])
for i in range(len(l)):
    value = f(l[i])
    if value < smallest:
        smallest = value
        index = i

Isso é bom, mas horrendo para o código-golfe. Mesmo se fosse golfe

i,s=0,f(l[0])
for x in range(len(l)):
 v=f(l[x])
 if v<s:s,i=v,x

Esta é uma solução ruim. A solução mais curta que consigo pensar é:

g=[f(x)for x in l];print(l[g.index(min(g))])

(44 bytes) Como posso resolver isso ainda mais?

James
fonte
8
Apenas min(l,key=f).
vaultah
2
@vaultah Poste isso como resposta.
NoOneIsHere
4
@ KevinLau-notKenny Esta é uma pergunta de dicas . Isso está no tópico.
NoOneIsHere 17/05
2
@trichoplax, na verdade, eu acho que é esse: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman
2
Este é um tópico interessante. Talvez torná-lo geral, não limitado a Python? Pode ser interessante ver como fazer isso em diferentes idiomas
Luis Mendo 17/05

Respostas:

10

Usar keypropriedade demin

Como o @vaultah disse, use min(l,key=f). min(l,key=f)leva o mínimo de f(i)para identro l.

Também é possível aplicar isso a max, e sorted. Por exemplo, max(l,key=f)é o máximo de f(i)para identro l. Para sorted, o uso seria: sorted(l,key=f).

NoOneIsHere
fonte
11
Por enquanto, estou aceitando isso, mas aceitarei uma resposta do @vaultah se ele postar.
James