f(item)が最小のリストでアイテムを見つける方法は?


10

リストlと関数がありますff厳密に増加または減少しているわけではありません。リストで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)
2016年

2
@vaultah回答として投稿してください。
NoOneIsHere

4
@ KevinLau-notKennyこれはヒントの質問です。それは話題です。
NoOneIsHere

2
@trichoplax実際にはこれだと思います:meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman

2
これは興味深いトピックです。多分それをPythonに限らず一般的にしますか?それをさまざまな言語で行う方法を見るのは興味深いかもしれません
Luis Mendo '17

回答:


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からの回答を受け入れます。
ジェームズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.