python:float()参数中出现错误,必须是字符串或数字

python:float()参数中出现错误,必须是字符串或数字,python,typeerror,Python,Typeerror,我现在是一名Python新手,我通过在上完课程来学习这一点。这个网站提供了一个在线评判系统,就像一个ACM一样,可以检查我的代码是否工作正常。除此之外,它在我的其他代码上也非常有效 我试图在安装了Python2.6的情况下将这段代码复制到我的本地pc上,它可以正常工作 顺便问一下,你能给像我这样的初学者推荐一些Python语法书吗?我只是想知道一些关于这种语言的内部细节 因为我不能在这里发布图片,所以我只粘贴下面的代码: 在我的mac电脑上: : 在网站上:标题是:熟能生巧15/15: def

我现在是一名Python新手,我通过在上完课程来学习这一点。这个网站提供了一个在线评判系统,就像一个ACM一样,可以检查我的代码是否工作正常。除此之外,它在我的其他代码上也非常有效

我试图在安装了Python2.6的情况下将这段代码复制到我的本地pc上,它可以正常工作

顺便问一下,你能给像我这样的初学者推荐一些Python语法书吗?我只是想知道一些关于这种语言的内部细节

因为我不能在这里发布图片,所以我只粘贴下面的代码:

在我的mac电脑上: :

在网站上:标题是:熟能生巧15/15:

def median(li):

    if len(li) >= 2:
        li_test = sorted(li)
        if len(li_test)%2 == 0:
            cd1 = len(li_test)/2-1
            cd2 = cd1 
            re = (li_test[cd1] + li_test[cd2])/2.0
        else:
            cd = (len(li_test)+1)/2-1
            re = li_test[cd]
    else:
        re = li
    return re


Oops, try again. Your function crashed on [1] as input because your function throws a "float() argument must be a string or a number" error.
发生此错误的原因是,如果
li
的长度为1或0,则返回
列表
li

>>> median([1])
[1]
>>> median([0])
[0]
也许你想要

if len(li) >= 1:
  ...
else:
    raise IndexError("No items in this list")
代码中的另一个错误是,如果列表中有偶数个元素,则应取中间两个元素的平均值。但在你的代码中

    if len(li_test)%2 == 0:
        cd1 = len(li_test)/2-1
        cd2 = cd1 
        re = (li_test[cd1] + li_test[cd2])/2.0
取两个中间元素中的一个,将相同的数字加两次,然后除以2。应该是

    if len(li_test) % 2 == 0:
        cd1 = len(li_test) / 2
        cd2 = cd1 - 1
        re = (li_test[cd1] + li_test[cd2])/2.0

不,我想我做不到。这是一个在线评判系统,所以我只能制作代码以满足其标准。在[1]的长度为1的情况下,很明显中位数是1,所以我只返回了数字。我看不出有什么错误。您返回的是
列表
[1]
而不是
int
1
TK,来说明Jay的第二点--
[1,3]
的中值是多少?对不起,我正忙于上课。。我知道我的错在哪里了。[0]和0不是一回事。对不起,我曾经是一个Matlab用户,这两个都很混乱。看来我需要更多的练习。谢谢你们的帮助。
    if len(li_test)%2 == 0:
        cd1 = len(li_test)/2-1
        cd2 = cd1 
        re = (li_test[cd1] + li_test[cd2])/2.0
    if len(li_test) % 2 == 0:
        cd1 = len(li_test) / 2
        cd2 = cd1 - 1
        re = (li_test[cd1] + li_test[cd2])/2.0