Як знайти предмет у списку, чий 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.