在不使用排序函数的情况下查找中值

时间:2012-09-07 21:35:06

标签: python median

作为家庭作业,我必须编写一个脚本,找到3个给定数字的中位数,而不使用Python的标准排序函数。

这是我上课的第一周和我的第一次编程经历,所以我觉得很难比现在更进一步。

这是我到目前为止所拥有的:

def med3(a,b,c):
    list = [a, b, c]
    newlist = []
    if list:
        minimum = list[0]
        for x in list:
            if x < minimum:
                minimum = x
                newlist.append(minimum)
                list.remove(minimum)
            elif x >= minimum:
                newlist.append(x)
                list.remove(x)

    return newlist[1]

这似乎可以解决问题,但仅适用于列表的前两个条目。循环不包括第三个条目。

如何让脚本包含所有三个条目?

提前致谢! 桑德

4 个答案:

答案 0 :(得分:6)

sum([a, b, c]) - min(a, b, c) - max(a, b, c) - 没有排序!

答案 1 :(得分:0)

您正在循环修改列表,这会对您看到的元素产生影响:

>>> numbers = [1,2,3]
>>> for i in numbers:
...     if i == 2: numbers.remove(i)
...     print i
... 
1
2

请注意永远不会打印3;通过删除列表中的第二个条目,我们将其缩短了一个元素,并且循环找到了早期耗尽的列表。

请注意,您不需要 来循环播放这些项目,一些简单的比较会告诉您,如果您考虑一下,该项目的中位数是什么。 : - )

答案 2 :(得分:0)

有许多更简单的方法可以解决这个问题,但至于你的方法:

您正在修改循环中的list。不要那样做。 :)

在您的情况下,您应该从新列表中删除元素:

def med3(a,b,c):
    list = [a, b, c]
    newlist = []
    if list:
        minimum = list[0]
        for x in list:
            if x < minimum:
                minimum = x
                newlist.pop()
                newlist.append(minimum)
            elif x >= minimum:
                newlist.append(x)
    return newlist[1]

但作为练习,你可能想要考虑一些事情:

  • 为什么要将元素放在列表中并循环遍历它们?与简单的if语句比较a,b,c有什么优势?

  • 为什么if list:

答案 3 :(得分:0)

最快的方法:

def medianFast(a, b, c):
    if a > b:
        if b > c: 
            return b
        elif a > c:
            return c
        else:
            return a
    else:
        if b < c: 
            return b
        elif a > c:
            return a
        else:
            return c

在最坏的情况下保证3次比较,在最好的情况下保证2次比较。 2,5平均比较。

使用ternary conditional我们可以将其缩短为:

def medianTernary(a, b, c):
    return (b if b > c else (c if a > c else a)) if a > b else (b if b < c else (a if a > c else c))

如果你可以使用排序,你将拥有最短的版本:

def medianSorted(a, b, c):
    return sorted([a, b, c])[1]