Pythonで関数を作成して、すべての関数引数の中で最も高いものを見つけ、値の「タグ」を返します

StackOverflow https://stackoverflow.com/questions/4577345

  •  14-10-2019
  •  | 
  •  

質問

以下を検討してください:p1 = 1; p2 = 5; p3 = 7;最高= max(p1、p2、p3)。

MAX関数は7を返します。「P3」を返す同様の関数を作成しようとしています。上記の例では、以下に示すように、小さな関数(簡単な比較による)を作成しました。しかし、私は議論の数が増えるときに問題を抱えています。

def highest(p1,p2,p3):
    if (p1>p2) and (p1>p3):
        return "p1"
    if (p2>p1) and (p2>p3):
        return "p2"
    if (p3>p1) and (p3>p1):
        return "p3"

これを行うためのより簡単な方法はありますか>

役に立ちましたか?

解決

更新:Paul Hankinは、Max()が重要な機能を獲得したことを指摘しました。それで:

>>> def argmax(**kw):
...   return max(kw, key=kw.get)
... 
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)
'bar'

完全性のためのその他のソリューション:

Python 2.7および3.xでは、辞書の概念を使用できます。

>>> def argmax(**kw):
...     wk = {v:k for k,v in kw.items()}
...     return wk[max(wk)]
... 
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)   
'bar'

辞書の概念はきれいです。 :)

Pythonの以前のバージョンでは、これを行うことができます。

>>> def argmax(**kw):
...     wk = dict([(v,k) for k,v in kw.items()])
...     return wk[max(wk)]
... 
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)   
'bar'

Python 2.2程度の後、何でも機能します。

他のヒント

の名前を取得する方法はありません 変数 それは最高値を持っていました 発信者 (それは数字または複雑な式である可能性があるため)が、キーワード引数のみを使用することにより、 パラメーター. 。このようなもの:

def argmax(**kwargs):
    mx = -1e+400 # overflows to -Inf
    amx = None
    for k, v in kwargs.iteritems():
        if v > mx:
            mx = v
            amx = k
    return amx

このような作品:

>>> argmax(a=1,b=2,c=3)
'c'

しかし、キャッチは、議論のいずれかが位置的である場合、それは機能しないということです。

>>> argmax(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argmax() takes exactly 0 arguments (3 given)

あなたがしていることに応じて、この構造はより便利かもしれません:(帽子の先端 http://lemire.me/blog/archives/2008/12/17/fast-argmax-in-python/ )

>>> a = [9,99,999]
>>> a.index(max(a))
2

これを拡張可能に近づける唯一の方法は、リストを引数として取得し、その最高要素のインデックスを返すことです。あなたが本当に望むなら、あなたは前にAPを置き、1でカウントを始めることができます。

def highest(x):
    return 'p' + repr(x.index(max(x))+1)

明らかに、可変長さの引数を処理しません。可変長さの引数が必要な場合は、それは別の問題です。 10の引数がある場合は、定義にそれらを追加するだけで、正しい引数名が返されます(必ずしも「P」で開始されるわけではありません)。しかし、キャッチは、引数の数(3または5または10など)が可変ではないことです。必要な引数の数を知る必要があります。

def highest(p1,p2,p3,p4,p5):
    d = locals()
    keys = d.keys()
    max_key = keys[0]
    max_val = d[max_key]
    for i in range(1,len(keys)):
        key = keys[i]
        val = d[key]
        if val > max_val:
            max_val = val
            max_key = key

    return max_key

print highest(3,2,5,10,1)
print highest(1,5,2,2,3)
print highest(5,2,5,1,11)
print highest(3,2,1,1,2)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top