【问题标题】:Median code explanation中位数代码说明
【发布时间】:2011-11-26 13:55:22
【问题描述】:

我的教授写了这个中值函数,我不是很理解。有人可以解释一下i = len(list)/2median = avg()else声明的部分吗?

def avg_list(numbers):  
    sum = 0 
    for num in numbers:
        sum += num

    avg = float(sum)/len(numbers)
    print avg

def median(list):            
    list.sort()
    if len(list)%2 == 0:
        #have to take avg of middle two
        i = len(list)/2
        median = avg()
    else:
        #find the middle (remembering that lists start at 0)
        i = len(list)/2
        median = list        
    return median

从我看到的一个例子中添加,对于偶数列表长度:

def median(s):
    i = len(s)
    if not i%2:
        return (s[(i/2)-1]+s[i/2])/2.0
    return s[i/2]

这很好用,但我不明白最后一个return s[i/2]

对于奇数列表长度:

x = [1,2,5,2,3,763,234,23,1,234,21,3,2134,23,54]
median = sorted(x)[len(x)/2]

既然x 的列表长度是奇数,那么[len(x)/2] 不是浮点数索引吗?我没有得到这个所有的方式?任何比我更好的解释都非常感谢。

【问题讨论】:

  • 这段代码对我来说似乎不正确。
  • 请这样标记家庭作业。谢谢。
  • @samack:不清楚它的功课。理解您的教授所写的内容与被要求在作业中解释它不同......我认为这个问题没有任何问题。
  • len(x)/2 返回一个整数,因为 len(x)2 都是整数。
  • @eryksun 我很抱歉没有使用'//' 运算符,只做了 3 周。

标签: python median


【解决方案1】:

为什么这是非常错误的,逐行:

def median(list):              # 1

    list.sort()                # 2

        if len(list)%2 == 0:   
        #have to take avg of middle two
            i = len(list)/2    # 3
            median = avg()     # 4
        else:
            #find the middle (remembering that lists start at 0)
            i = len(list)/2    # 5
            median = list      # 6

        return median

#1:给变量取与数据类型相同的名称是个坏主意,即list

#2list.sort() 将修改正在传递的列表。人们会期望像median() 这样的吸气剂不会这样做。

#4它调用了一个没有参数的函数avg(),这完全没有意义,即使定义了这样的函数。

#3#5 的计算方式相同,与采用的 if 分支无关。不管怎样,i 永远不会被使用。

#6 它将median 设置为原始的list,这使得零意义。


以下是我将如何重写(同时保持清晰):

def median(alist):

    srtd = sorted(alist) # returns a sorted copy
    mid = len(alist)/2   # remember that integer division truncates

    if len(alist) % 2 == 0:  # take the avg of middle two
        return (srtd[mid-1] + srtd[mid]) / 2.0
    else:
        return srtd[mid]

另外,avg_list() 函数(在median() 中没有使用也不能使用)可以重写为:

def avg_list(numbers):  
    return float(sum(numbers))/len(numbers)

sum() 是一个返回可迭代对象中所有元素之和的函数。

【讨论】:

  • 谢谢你!感谢您的精彩解释和教育:)
  • NullUserException ఠ_ఠ 我试过你的代码看起来很完美,但输入 3 和 6 时出现错误 TypeError: list indices must be integers, not float
  • 如果你使用的是python 3(或from __future__ import division),那么len(alist)/2是浮点除法;改用整数除法len(alist)//2
【解决方案2】:

我们在这里遗漏了一些代码,但我们可以把它弄明白。

这里的 cmets 很有指导意义。当我们检查时:

    if len(list)%2 == 0:

然后我们检查列表的长度是否相等。如果列表的成员数为偶数,则不存在真正的“中间”元素,因此:

    #have to take avg of middle two
        i = len(list)/2
        median = avg()

我们假设 avg() 函数将返回两个中间元素的平均值。由于您没有包含 avg 函数的定义,因此这可能真的应该是一个 avg_list 函数,它采用列表的中间两个元素。

现在,如果列表长度为奇数,则有一个中间元素,所以:

    else:
        #find the middle (remembering that lists start at 0)
        i = len(list)/2
        median = list

现在这对我来说也有点错误,但我的猜测是本意是应该这样写:

median = list[i]

那将是我们返回列表的中间元素。由于列表已经排序,中间的元素就是列表的真正中位数。

希望这会有所帮助!

【讨论】:

  • 当你说,我们假设 avg() 函数将返回两个中间元素的平均值。你在哪里看到的?该程序的任何部分如何表明它正在选择中间两个数字并进行除法?感谢您对其余部分的解释......它非常有帮助!
  • GG:要清楚,当我说“我们假设”时,这是字面意思:我假设它,因为偶数个元素的中位数的标准定义是中间的平均值两个要素。但正如之前的评论所指出的,avg() 不是这里定义的函数,因此这不是合法代码。
  • 我确定他的意思是我认为的 avg_list()。
【解决方案3】:

我确定它试图说:“如果列表的大小为奇数,则取中间元素;否则取中间两个元素的平均值" - 但我看不出代码实际上是在做什么

特别是:

  • 它正在调用 avg() 函数(不是 avg_list,注意)但没有任何参数
  • 在两个分支中以相同的方式计算 i 的值后忽略它

您确定这是打算工作的完整代码吗?

【讨论】:

  • 对所有人...逐字逐句,我复制并粘贴了我的教授为我们写的内容,我无法理解,因为他遗漏了你们提到的所有内容。这是家庭作业,是的。我不是要答案,只是解释。我只是给了我的教授怀疑的好处,他知道自己在做什么。猜不...
【解决方案4】:

您还可以决定始终返回有序列表的中间子数组的平均值: 例如返回 [1,2,3,4,5,6,7,8] 中 [4,5] 的平均值,以及 [1,2,3,4,5] 中 [5] 的平均值, 6,7,8,9]。

python 实现是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2013-09-12
    • 2017-01-23
    • 2014-09-21
    • 2016-06-01
    • 2015-01-13
    • 2015-08-16
    • 2010-11-25
    相关资源
    最近更新 更多