中位代码说明

时间:2011-09-28 05:23:57

标签: python median

我的教授写了这个中值函数,我不太了解它。有人可以解释有关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]不是浮点数索引吗?我不是一直都这么做的?任何比我更好的解释都非常感激。

4 个答案:

答案 0 :(得分:11)

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

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分支,

#5if都以相同的方式计算。无论如何,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()是一个函数,它返回可迭代中所有元素的总和。

答案 1 :(得分:5)

我们在这里遗漏了一些代码,但我们可以解决它。

这里的评论很有启发性。当我们检查时:

    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]

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

希望这有帮助!

答案 2 :(得分:2)

我确定尝试说:“如果列表是奇数,只需要取中心元素;否则取中心两个元素的平均值“ - 但我看不出这就是实际所做的代码。

特别是:

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

你确定这是意味着的完整代码吗?

答案 3 :(得分:2)

您还可以决定始终返回有序列表的中间子数组的平均值: 例如,从[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