Saya punya daftar, l
dan fungsi f
. f
tidak 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?
min(l,key=f)
.Jawaban:
Gunakan
key
properti darimin
Seperti yang dikatakan @vaultah, gunakan
min(l,key=f)
.min(l,key=f)
mengambil minimumf(i)
fori
inl
.Dimungkinkan juga untuk menerapkan ini pada
max
, dansorted
. Misalnya,max(l,key=f)
adalah maksimumf(i)
untuki
dalaml
. Untuksorted
, penggunaan akan:sorted(l,key=f)
.sumber