1

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

这是我上课的第一周,也是我的第一次编程体验,所以我发现很难比现在更进一步。

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

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

4 回答 4

6

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

于 2012-09-07T22:00:48.840 回答
0

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

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

请注意如何3从不打印;通过删除列表中的第二个条目,我们将其缩短了一个元素,并且循环发现列表提前耗尽。

请注意,您不需要遍历这些项目,如果您考虑一下,一些简单的比较会告诉您哪个项目是中位数。:-)

于 2012-09-07T21:45:41.963 回答
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 次比较。

使用三元条件,我们可以把它写得更短:

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]
于 2012-11-12T00:40:44.683 回答
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]

但作为练习,您可能需要考虑以下几点:

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

  • 为什么if list:

于 2012-09-07T21:48:21.307 回答