Как найти элемент в списке, у которого f (элемент) наименьший?


10

У меня есть список lи функция f. fне строго увеличивается или уменьшается. Как я могу найти элемент в списке, который f(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 байта) Как я могу играть в гольф дальше?


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? Может быть интересно посмотреть, как это сделать на разных языках
Луис Мендо

Ответы:


10

Используйте keyсвойствоmin

Как сказал @vaultah, используйте min(l,key=f). min(l,key=f)принимает минимум f(i)за iв l.

Также возможно применить это к max, и sorted. Например, max(l,key=f)это максимум f(i)для iв l. Для sorted, использование будет: sorted(l,key=f).


1
Я принимаю это сейчас, но приму ответ от @vaultah, если он отправит это.
Джеймс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.