找到三个数字的中间

时间:2013-11-12 07:05:16

标签: python function python-2.7

我正在寻找替代或更简洁的方法来返回三个唯一值的中间值。我现在所拥有的是一个功能:

def middle(x, y, z):
    if x > y and x < z:
        return x
    if y > x and y < z:
        return y
    return z

还有什么更好的吗?

6 个答案:

答案 0 :(得分:8)

def middle(x, y, z):
    return sorted([x, y, z])[1]

这应该返回中间数字。但如果你真的意味着最大数量

def maximum(x, y, z):
    return max([x, y, z])

修改:正如评论部分中的abarnert所建议的那样,而不是使用y>x and x<z x < y < z,而是{{1}},它更具可读性和pythonic。

答案 1 :(得分:3)

使用Python 3.4,statistics.median位于标准库中:

import statistics

def middle(x, y, z):
    return statistics.median((x, y, z))

3.1-3.3,在pip install stats之后:

import stats

def middle(x, y, z):
    return stats.median((x, y, z))

我相信2.6-2.7的后端正在进行中,但尚不存在。 (对于2.5或3.0,只需升级。)

当然,如果你有4个值,你必须决定“中间”是什么意思; median将使用两个中间值的平均值,但您可能需要不同的东西。

答案 2 :(得分:2)

def middle(x, y, z):
    return x + y + z - max(x, y, z) - min(x, y, z)

只为了它的乐趣。

答案 3 :(得分:1)

只是为了好玩......

我们并不需要对所有三个值进行排序;我们只需要跟踪整个列表中最大的2个,对吗?

通常,这可能很有用,因此标准库有一种方法可以做到这一点:heapq.nlargest函数。

def middle(x, y, z):
    return heapq.nlargest(2, (x, y, z))[-1]

实际上,堆比排序列表慢得多,所以除非列表非常大(3远不够大),并且需要记住的元素数量非常小(2 / 3rds远不是那么小)这足以让你失望很多。快速测试将显示:

In [66]: %timeit heapq.nlargest(2, [1,2,3])[1]
100000 loops, best of 3: 2.78 us per loop

In [67]: %timeit sorted([1,2,3])[1]
1000000 loops, best of 3: 770 ns per loop

所以,不要在这里使用它,而是将它保存在工具箱中,以便下次需要500个中的10个最高分时。

答案 4 :(得分:1)

为了好玩:

def middle(x, y, z):
    if x < y:
        if y < z:
            return y
        elif x < z:
            return z
        else:
            return x
    else:
        if x < z:
            return x
        elif y > z:
            return y
        else:
            return z

答案 5 :(得分:0)

您还可以制作某种中值函数,该函数不仅适用于3个值

def median(list): 
    list = sorted(list) 
    if len(list) % 2 == 0: 
        n = len(list)//2 
        return (list[n]+list[n-1])/2 
    else: 
        return list[len(l)//2]