วิธีการค้นหารายการในรายการที่มี f (รายการ) มีขนาดเล็กที่สุด?


10

ฉันมีรายชื่อและฟังก์ชั่นl ไม่ได้เพิ่มหรือลดลงอย่างเคร่งครัด ฉันจะค้นหารายการในรายการที่มีขนาดเล็กที่สุดได้อย่างไร ตัวอย่างเช่นสมมติว่ารายการคือ:fff(item)

l = [1, 2, 3, 4]

และlist(f(x)for x in l)คือ:

[2, 9, 0, 3]

f(3)เล็กกว่า f ของอันอื่นดังนั้นควรพิมพ์ "3" วิธีที่สั้นที่สุดในการทำเช่นนี้คืออะไร? ตอนแรกฉันพยายาม:

min(f(x) for x in l)

แต่นี้จะช่วยให้ไม่ได้0 3หากฉันกำลังถ่ายภาพเพื่อความสะดวกในการอ่านไม่กระชับฉันจะทำ:

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

นี่เป็นเรื่องดี แต่น่ากลัวสำหรับรหัสกอล์ฟ แม้ว่ามันจะเป็นกอล์ฟ

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

นี่เป็นทางออกที่ไม่ดี ทางออกที่สั้นที่สุดที่ฉันนึกได้คือ:

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

(44 bytes) ฉันจะตีกอล์ฟนี้ต่อไปได้อย่างไร


8
min(l,key=f)เพียงแค่
vaultah

2
@vaultah โพสต์นั้นเป็นคำตอบ
NoOneIsHere ที่

4
@ KevinLau-notKenny นี่คือคำถามเคล็ดลับ นั่นคือในหัวข้อ
NoOneIsHere

2
@trichoplax จริง ๆ แล้วฉันคิดว่านี่คือ: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman

2
นี่เป็นหัวข้อที่น่าสนใจ อาจทำให้เป็นเรื่องทั่วไปไม่ จำกัด เฉพาะ Python ใช่ไหม อาจเป็นเรื่องที่น่าสนใจที่จะเห็นวิธีการทำเช่นนั้นในภาษาต่าง ๆ
Luis Mendo

คำตอบ:


10

ใช้keyคุณสมบัติของmin

ในฐานะที่เป็น @vaultah min(l,key=f)กล่าวว่าการใช้งาน min(l,key=f)ใช้เวลาอย่างน้อยของf(i)สำหรับในil

นอกจากนี้ยังเป็นไปได้ที่จะใช้นี้และmax sortedยกตัวอย่างเช่นmax(l,key=f)เป็นจำนวนสูงสุดของf(i)สำหรับในi lสำหรับsortedการใช้งานจะเป็น: sorted(l,key=f).


1
ฉันยอมรับสิ่งนี้ในตอนนี้ แต่จะยอมรับคำตอบจาก @vaultah หากเขาโพสต์ไว้
James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.