Bagaimana menemukan item dalam daftar yang f (item) terkecil?


10

Saya punya daftar, ldan fungsi f. ftidak secara ketat meningkat atau menurun. Bagaimana saya dapat menemukan item dalam daftar yang f(item)merupakan yang terkecil? Sebagai contoh, katakanlah daftarnya adalah:

l = [1, 2, 3, 4]

dan list(f(x)for x in l)adalah:

[2, 9, 0, 3]

f(3)lebih kecil dari f dari yang lain, jadi harus mencetak "3". Apa cara terpendek untuk melakukan ini? Saya awalnya mencoba:

min(f(x) for x in l)

Tapi ini memberi 0, bukan 3. Jika saya memotret untuk dibaca, bukan singkatnya, saya akan melakukan:

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

Ini bagus, tapi menghebohkan untuk golf kode. Bahkan jika itu golf

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

Ini solusi yang buruk. Solusi terpendek yang dapat saya pikirkan adalah:

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

(44 byte) Bagaimana saya bisa menurunkan ini lebih jauh?


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

2
@ vaultah Posting itu sebagai jawaban.
NoOneIsHere

4
@ KevinLau-notKenny Ini pertanyaan tip . Itu sesuai topik.
NoOneIsHere

2
@trichoplax sebenarnya saya pikir ini yang ini: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman

2
Ini adalah topik yang menarik. Mungkin membuatnya umum, tidak terbatas pada Python? Mungkin menarik untuk melihat bagaimana melakukannya dalam berbagai bahasa
Luis Mendo

Jawaban:


10

Gunakan keyproperti darimin

Seperti yang dikatakan @vaultah, gunakan min(l,key=f). min(l,key=f)mengambil minimum f(i)for iin l.

Dimungkinkan juga untuk menerapkan ini pada max, dan sorted. Misalnya, max(l,key=f)adalah maksimum f(i)untuk idalam l. Untuk sorted, penggunaan akan: sorted(l,key=f).


1
Saya menerima ini untuk saat ini, tetapi akan menerima jawaban dari @vaultah jika dia mempostingnya.
James
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.