Mam listę l
i funkcję f
. f
nie 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?
min(l,key=f)
.Odpowiedzi:
Użyj
key
właściwościmin
Jak powiedział @vaultah, użyj
min(l,key=f)
.min(l,key=f)
trwa minimumf(i)
doi
wl
.Można również zastosować to do
max
isorted
. Na przykładmax(l,key=f)
jest maksymalną wartościąf(i)
dlai
wl
. Nasorted
, użycie byłoby:sorted(l,key=f)
.źródło