Come trovare l'elemento in un elenco di cui f (elemento) è il più piccolo?


10

Ho un elenco le una funzione f. fnon è strettamente crescente o decrescente. Come posso trovare l'elemento nell'elenco di cui f(item)è il più piccolo? Ad esempio, supponiamo che l'elenco sia:

l = [1, 2, 3, 4]

ed list(f(x)for x in l)è:

[2, 9, 0, 3]

f(3)è più piccolo di f degli altri, quindi dovrebbe stampare "3". Qual è il modo più breve per farlo? Inizialmente ho provato:

min(f(x) for x in l)

Ma questo dà 0, non è 3. Se stavo girando per leggibilità, non per brevità, farei:

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

Questo va bene, ma orrendo per il code-golf. Anche se è stato giocato a golf

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

Questa è una cattiva soluzione. La soluzione più breve che mi viene in mente è:

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

(44 byte) Come posso continuare a giocare a questo?


8
Basta min(l,key=f).
vaultah,

2
@vaultah Pubblica questo come una risposta.
NoOneIsHere

4
@ KevinLau-notKenny Questa è una domanda di suggerimenti . Questo è in argomento.
NoOneIsHere

2
@trichoplax in realtà penso che sia questo: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman

2
Questo è un argomento interessante. Forse renderlo generale, non limitato a Python? Potrebbe essere interessante vedere come farlo in diverse lingue
Luis Mendo,

Risposte:


10

Usa la keyproprietà dimin

Come diceva @vaultah, usa min(l,key=f). min(l,key=f)prende il minimo di f(i)for iin l.

È anche possibile applicare questo a max, e sorted. Ad esempio, max(l,key=f)è il massimo di f(i)for iin l. Per sorted, l'utilizzo potrebbe essere: sorted(l,key=f).


1
Lo sto accettando per ora, ma accetterò una risposta da @vaultah se lo pubblica.
James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.