Jak znaleźć pozycję na liście, której f (pozycja) jest najmniejsza?

10

Mam listę li funkcję f. fnie jest ściśle rosnąca ani malejąca. Jak znaleźć pozycję na liście, która f(item)jest najmniejsza? Załóżmy na przykład, że lista to:

l = [1, 2, 3, 4]

i list(f(x)for x in l)jest:

[2, 9, 0, 3]

f(3)jest mniejsza niż f pozostałych, więc powinna wypisać „3”. Jaki jest najkrótszy sposób to zrobić? Początkowo próbowałem:

min(f(x) for x in l)

Ale to daje 0, nie 3. Gdybym fotografował dla czytelności, a nie dla zwięzłości, zrobiłbym:

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

To dobrze, ale przerażające jak na golfa. Nawet jeśli był w golfa

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

To złe rozwiązanie. Najkrótsze rozwiązanie, jakie mogę wymyślić, to:

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

(44 bajty) Jak mogę dalej grać w golfa?

James
źródło
8
Właśnie min(l,key=f).
vaultah
2
@vaultah Opublikuj to jako odpowiedź.
NoOneIsHere
4
@ KevinLau-notKenny To pytanie ze wskazówkami . To jest na temat.
NoOneIsHere
2
@trichoplax właściwie myślę, że to ten: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman
2
To ciekawy temat. Być może uogólniając, nie ograniczając się do Pythona? Ciekawie może być zobaczyć, jak to zrobić w różnych językach
Luis Mendo

Odpowiedzi:

10

Użyj keywłaściwościmin

Jak powiedział @vaultah, użyj min(l,key=f). min(l,key=f)trwa minimum f(i)do iw l.

Można również zastosować to do maxi sorted. Na przykład max(l,key=f)jest maksymalną wartością f(i)dla iw l. Na sorted, użycie byłoby: sorted(l,key=f).

NoOneIsHere
źródło
1
Akceptuję to na razie, ale zaakceptuję odpowiedź od @vaultah, jeśli ją opublikuje.
James