Comment trouver l'item dans une liste dont f (item) est le plus petit?

10

J'ai une liste let une fonction f. fn'augmente ni ne diminue strictement. Comment trouver l'élément de la liste dont f(item)le plus petit est? Par exemple, supposons que la liste soit:

l = [1, 2, 3, 4]

et list(f(x)for x in l)c'est:

[2, 9, 0, 3]

f(3)est plus petit que f de tous les autres, il devrait donc afficher "3". Quelle est la manière la plus courte de procéder? J'ai d'abord essayé:

min(f(x) for x in l)

Mais cela donne 0, non 3. Si je tournais pour plus de lisibilité, pas de concision, je ferais:

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

C'est bien, mais horrible pour le code-golf. Même s'il a été joué au golf

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

C'est une mauvaise solution. La solution la plus courte à laquelle je peux penser est:

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

(44 octets) Comment puis-je continuer à jouer au golf?

James
la source
8
Justement min(l,key=f).
vaultah
2
@vaultah Postez cela comme une réponse.
NoOneIsHere
4
@ KevinLau-notKenny Ceci est une question de conseils . C'est sur le sujet.
NoOneIsHere
2
@trichoplax en fait je pense que c'est celui-ci: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman
2
C'est un sujet intéressant. Peut-être le rendre général, non limité à Python? Il peut être intéressant de voir comment procéder dans différentes langues
Luis Mendo

Réponses:

10

Utiliser la keypropriété demin

Comme l'a dit @vaultah, utilisez min(l,key=f). min(l,key=f)prend le minimum de f(i)pour idans l.

Il est également possible de l'appliquer à max, et sorted. Par exemple, max(l,key=f)est le maximum de f(i)pour idans l. Pour sorted, l'utilisation serait: sorted(l,key=f).

NoOneIsHere
la source
1
J'accepte ceci pour l'instant, mais j'accepterai une réponse de @vaultah s'il la publie.
James