Wie finde ich das Element in einer Liste, deren f (Element) das kleinste ist?


10

Ich habe eine Liste lund eine Funktion f. fnimmt nicht streng zu oder ab. Wie finde ich das Element in der Liste, dessen f(item)kleinstes ist? Angenommen, die Liste lautet:

l = [1, 2, 3, 4]

und list(f(x)for x in l)ist:

[2, 9, 0, 3]

f(3)ist kleiner als f von allen anderen, daher sollte "3" gedruckt werden. Was ist der kürzeste Weg, um dies zu tun? Ich habe zunächst versucht:

min(f(x) for x in l)

Aber das gibt 0nicht 3. Wenn ich aus Gründen der Lesbarkeit und nicht der Kürze fotografieren würde, würde ich Folgendes tun:

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

Das ist in Ordnung, aber für Code-Golf schrecklich. Auch wenn es Golf war

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

Dies ist eine schlechte Lösung. Die kürzeste Lösung, die ich mir vorstellen kann, ist:

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

(44 Bytes) Wie kann ich das weiter unten spielen?


8
Einfach min(l,key=f).
Vaultah

2
@ vaultah Poste das als Antwort.
NoOneIsHere

4
@ KevinLau-notKenny Dies ist eine Frage mit Tipps . Das ist zum Thema.
NoOneIsHere

2
@ Trichoplax eigentlich denke ich, dass es dieses ist: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman

2
Dies ist ein interessantes Thema. Vielleicht allgemein machen, nicht auf Python beschränkt? Es kann interessant sein zu sehen, wie man das in verschiedenen Sprachen macht
Luis Mendo

Antworten:


10

Verwenden Sie die keyEigenschaft vonmin

Wie @vaultah sagte, verwenden Sie min(l,key=f). min(l,key=f)nimmt das Minimum von f(i)für iin l.

Es ist auch möglich, dies auf maxund anzuwenden sorted. Zum Beispiel max(l,key=f)ist das Maximum von f(i)für iin l. Für sortedwäre die Verwendung : sorted(l,key=f).


1
Ich akzeptiere dies vorerst, werde aber eine Antwort von @vaultah akzeptieren, wenn er sie veröffentlicht.
James
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.