Eu tenho uma lista l
e uma função f
. f
nã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?
min(l,key=f)
.Respostas:
Usar
key
propriedade demin
Como o @vaultah disse, use
min(l,key=f)
.min(l,key=f)
leva o mínimo def(i)
parai
dentrol
.Também é possível aplicar isso a
max
, esorted
. Por exemplo,max(l,key=f)
é o máximo def(i)
parai
dentrol
. Parasorted
, o uso seria:sorted(l,key=f)
.fonte