Tengo una lista l
y una función f
. f
no 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?
min(l,key=f)
.Respuestas:
Usar
key
propiedad demin
Como dijo @vaultah, úsalo
min(l,key=f)
.min(l,key=f)
toma el mínimo def(i)
fori
inl
.También es posible aplicar esto a
max
, ysorted
. Por ejemplo,max(l,key=f)
es el máximo def(i)
fori
inl
. Parasorted
, el uso sería:sorted(l,key=f)
.fuente