1

次のことを考慮してください。p2=5; p3=7; 最高=最大(p1、p2、p3)。

max 関数は 7 を返します。「p3」を返す同様の関数を作成しようとしています。以下に示すように、上記の例に対して (単純な比較により) 小さな関数を作成しました。ただし、引数の数が増えると問題が発生します。

デフォルト最高 (p1、p2、p3):
    (p1>p2) かつ (p1>p3) の場合:
        「p1」を返す
    (p2>p1) かつ (p2>p3) の場合:
        「p2」を返す
    (p3>p1) かつ (p3>p1) の場合:
        「p3」を返す

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

4

4 に答える 4

5

呼び出し元で最大値を持つ変数の名前を取得する方法はありませんが (数値または複雑な式である可能性があるため)、キーワード引数を排他的に使用することで、パラメーターの名前を取得できます。このようなもの:

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)

何をしているかにもよりますが、この構造体はより便利かもしれませ:

>>> a = [9,99,999]
>>> a.index(max(a))
2
于 2011-01-02T06:24:08.523 に答える
5

更新: 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 以降で動作します。

于 2011-01-02T12:53:19.773 に答える
0

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

デフォルト最高 (p1、p2、p3、p4、p5):
    d = ローカル ()
    キー = d.keys()
    max_key = キー[0]
    max_val = d[最大キー]
    for i in range(1,len(keys)):
        キー = キー[i]
        val = d[キー]
        val > max_val の場合:
            max_val = 値
            max_key = キー

    max_key を返す

最高値を出力(3,2,5,10,1)
最高値を出力(1,5,2,2,3)
最高値を出力(5,2,5,1,11)
最高値を出力(3,2,1,1,2)
于 2011-01-02T06:37:55.690 に答える
0

これを拡張可能に近づける唯一の方法は、リストを引数として取り、その最上位要素のインデックスを返すことです。本当にしたい場合は、前に ap を置いて 1 からカウントを開始できます。

def highest(x):
    return 'p' + repr(x.index(max(x))+1)
于 2011-01-02T07:13:31.537 に答える