【问题标题】:Create function in python to find the highest of all function arguments, and return the "tag" of the value在 python 中创建函数以查找所有函数参数中的最大值,并返回值的“标签”
【发布时间】:2011-06-02 10:01:07
【问题描述】:

考虑以下几点: p1=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”

有没有更简单的方法来做到这一点>

【问题讨论】:

    标签: python function highest


    【解决方案1】:

    更新: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 之后的任何版本中都可以使用。

    【讨论】:

    • return max(kw, key=kw.get) 怎么样(适用于 Python 2.5 及更高版本)。
    • 啊!我不知道max带了一个关键功能。太棒了!
    • 非常感谢。这很有帮助,感谢@Paul Hankin 指出 max 具有关键功能。
    【解决方案2】:

    没有办法得到 caller 中具有最高值的 变量 的名称(因为它可能是一个数字或一个复杂的表达式),但是通过专门使用关键字参数,您可以获得参数的名称。像这样的:

    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
    

    【讨论】:

    • 这个函数的主体可以写得更简洁:return max(kwargs, key=kwargs.get)
    • float('-inf') 给出 -Inf,但您可以改用 None
    • THC4k:很高兴了解float('-inf')(None &lt; any_number) == True 对我来说似乎是一种永远不应该使用的语言怪癖。 Paul, Lennart:我也不知道max 的关键参数。同意这是一种更简洁的编写方式,但我将保留我的答案,因为它说明了一种更通用的技术。
    【解决方案3】:

    保持这个接近可扩展的唯一方法是将列表作为参数并返回其最高元素的索引。如果你真的想的话,你可以在前面放一个 p 并从 1 开始数。

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

    【讨论】:

      【解决方案4】:

      显然它不处理可变长度参数。如果您想要可变长度参数,那么这是一个不同的问题。如果您有 10 个参数,那么只需将它们添加到定义中,它将返回正确的参数名称(不一定以“p”开头)。但问题是参数的数量(3 或 5 或 10 或其他)是不可变的。您需要知道需要多少个参数。

      def 最高(p1,p2,p3,p4,p5): d = 本地人() 键 = d.keys() max_key = 键[0] max_val = d[max_key] 对于范围内的 i (1,len(keys)): 键=键[i] val = d[键] 如果 val > max_val: 最大价值 = 价值 max_key = 键 返回最大键 打印最高(3,2,5,10,1) 打印最高(1,5,2,2,3) 打印最高(5,2,5,1,11) 打印最高(3,2,1,1,2)

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        相关资源
        最近更新 更多