¿Cómo encontrar el elemento en una lista cuyo f (elemento) es el más pequeño?

10

Tengo una lista ly una función f. fno está estrictamente aumentando o disminuyendo. ¿Cómo puedo encontrar el elemento en la lista cuyo f(item)es el más pequeño? Por ejemplo, digamos que la lista es:

l = [1, 2, 3, 4]

y list(f(x)for x in l)es:

[2, 9, 0, 3]

f(3)es más pequeño que f de cualquiera de los otros, por lo que debería imprimir "3". ¿Cuál es la forma más corta de hacer esto? Inicialmente intenté:

min(f(x) for x in l)

Pero esto da 0, no 3. Si estuviera filmando por legibilidad, no por brevedad, haría:

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

Esto está bien, pero es terrible para el golf de código. Incluso si fuera golf

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

Esta es una mala solución. La solución más corta que se me ocurre es:

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

(44 bytes) ¿Cómo puedo jugar más golf?

James
fuente
8
Justo min(l,key=f).
Vaultah
2
@vaultah Publique eso como respuesta.
NoOneIsHere
44
@ KevinLau-notKenny Esta es una pregunta de consejos . Eso es sobre el tema.
NoOneIsHere
2
@trichoplax en realidad creo que es este: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman
2
Este es un tema interesante. ¿Quizás lo haga general, no limitado a Python? Puede ser interesante ver cómo hacerlo en diferentes idiomas
Luis Mendo

Respuestas:

10

Usar keypropiedad demin

Como dijo @vaultah, úsalo min(l,key=f). min(l,key=f)toma el mínimo de f(i)for iin l.

También es posible aplicar esto a max, y sorted. Por ejemplo, max(l,key=f)es el máximo de f(i)for iin l. Para sorted, el uso sería: sorted(l,key=f).

NoOneIsHere
fuente
1
Estoy aceptando esto por ahora, pero aceptaré una respuesta de @vaultah si la publica.
James