中位代码说明

G.G*_*G.G 6 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
Run Code Online (Sandbox Code Playgroud)

从我看到的一个例子中添加,即使是列表长度:

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

这很好用,但我不明白最后一个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]
Run Code Online (Sandbox Code Playgroud)

由于x列表长度为奇数,不是[len(x)/2]浮点数索引吗?我不是一直都这么做的?任何比我更好的解释都非常感谢.

Nul*_*ion 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
Run Code Online (Sandbox Code Playgroud)

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

#2:list.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]
Run Code Online (Sandbox Code Playgroud)

此外,该avg_list()功能(未使用也无法使用median())可以重写为:

def avg_list(numbers):  
    return float(sum(numbers))/len(numbers)
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

    if len(list)%2 == 0:
Run Code Online (Sandbox Code Playgroud)

然后我们检查列表是否长度均匀.如果列表具有偶数个成员,则没有真正的"中间"元素,因此:

    #have to take avg of middle two
        i = len(list)/2
        median = avg()
Run Code Online (Sandbox Code Playgroud)

我们假设avg()函数将返回两个中间元素的平均值.由于你没有包含avg函数的定义,所以这可能是一个avg_list函数,它取了列表的中间两个元素.

现在,如果列表是奇数长度,则有一个中间元素,因此:

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

现在这看起来对我来说也有点不对,但我的猜测是,这应该是:

median = list[i]
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!