2016-11-04 77 views
0

一直卡在这最后一刻,对于我的生活无法找到问题所在。所以有问题的练习是:以列表作为输入并返回中间值

编写一个名为median的函数,它将一个列表作为输入并返回列表的中值。例如:median([1,1,2])应该返回1.

我在codeacadamy这样做的,它不断告诉我它得到的答复是4(应为4.5作为测试列表有使用来检查我的代码为[4, 5,5,4])。为了让事情变得更加奇怪,我在cscircles网站上的控制台IDE上尝试了代码(就像它的感觉),并说它很好。

def median(y): 
    x = sorted(y) 
    x_len = len(x) 
    if x_len % 2 == 0: 
     start = x_len // 2 
     median = (x[start-1] + x[start])/2 
     return median 
    else: 
     start = x_len // 2 
     median = x[start] 
     return median 
+0

如果你的输出不能保证是单调的,要找到中位数,你需要事先排序列表。另外,Python 2中的整数除法(正如其他人所提到的)。 –

+0

可能的整数除法。尝试从文件顶部的__future__导入部分添加 – wrdeman

+0

顺便说一下[查找列表的中位数](https://stackoverflow.com/questions/24101524/finding-median-of-list-in-python?rq = 1)已经被问到 –

回答

1

强制转换为浮动第一。 float((x[start-1] + x[start]))/2

+0

哈哈。它正在转换为一个整数,所以它四舍五入到4.得到它!非常感谢您的帮助。那个人很讨厌我,因为这对我来说应该很容易。 –

2

打开一个Python 2 REPL和尝试以下操作:

>>> (4+5)/2 
4 

您可以通过使用2.0迫使浮动师。

>>> (4+5)/2.0 
4.5 

在Python 3的第一个例子将产生4.5,这将占Codecademy网站和其他部位之间的差。

你也可以看到,如果添加下面的导入,使上Codecademy网站代码的工作:

from __future__ import division 
+0

他们从不同的在线系统得到不同结果的原因很可能是由于其中一些人使用Python 3,其中“真正”的划分是默认的。看起来OP由于使用'//'操作符而学习了Python 3。 – L3viathan

+0

是的,我刚刚更新了我的答案,而您的评论似乎澄清了这一点。 –

+0

@ L3viathan'//'也可以在许多早期版本的Python中使用,唯一改变的是'/'的默认行为。您可以在2.7中用'from __future__ import division'方便地修改它。这种困惑正是为什么Python 3改变了事情的原因。 –

0

只是一个小的失误师两个int的

def median(y): 
x = sorted(y) 
x_len = len(x) 
if x_len % 2 == 0: 
    start = x_len // 2 
    median = (x[start-1] + x[start])/2.0 
    return median 
else: 
start = x_len // 2 
median = x[start] 
return median 

始终是一个int类型。你应该改变一部分作为浮动

0
def median(a): 
    ordered = sorted(a) 
    length = len(a) 
    return float((ordered[length/2] + ordered[-(length+1)/2]))/2 
+0

关于解释有点缺乏... – SamB

相关问题