找出三个数的中间值

3

我正在寻找返回三个唯一值中间值的替代或更简洁的方法。我现在有一个函数:

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

还有更好的选择吗?


9
返回排序后的三个参数中第二小的值。 - undefined
1
你的尝试实际上返回了三个数中的最高值。如果你需要编写这样的代码,请考虑使用Python提供的"between"形式:if y < x < z:。这样更容易阅读,也更不容易出错。(在这种情况下,甚至有一个更简单的答案,所以我只是将其作为注释而不是答案留下来。) - undefined
抱歉,我是个白痴-已编辑。 - undefined
2
@jmu303:在这些事情上,我们都是白痴,这就是为什么x < y < zy>x and x<z更好——即使像我或者你这样的白痴也不会搞错。 - undefined
@abarnert 谢谢。我在我的答案中加入了这个建议。 - undefined
问题中的函数不太正确。middle(2, 3, 1) 返回 1。实际上,无论是 x > y and x < z 还是 x > z and x < y 都会使 x 成为中间值。 - undefined
6个回答

9
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,使用更加通俗易懂、符合Python规范的写法x < y < z


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
def middle(x, y, z):
    return x + y + z - max(x, y, z) - min(x, y, z)

仅仅为了好玩。


3
聪明。但是试试 middle(1, 2, 1e200)。 :) - undefined

1

只是为了好玩...

我们不需要对三个值进行排序;我们只需要在遍历整个列表时跟踪最大的两个值,对吧?

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

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

实际上,与对列表进行排序相比,堆要慢得多,因此,除非列表非常大(3远远不够大),需要记住的元素数量非常小(2/3不够小),否则这将使您的速度很慢。通过快速测试可以证明:

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

因此,不要在这里使用它,但将其保留在工具箱中,以备下次需要从500000个分数中获取前10个最高分时使用。

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

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] 

为什么要编写一个中位数函数,当标准库(3.4)中已经有一个,或者在PyPI(之前版本)上可用呢? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接