我的教授写了这个中值函数,我不太了解它.可有人请解释这部分i = len(list)/2和median = 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)
那将是我们返回列表的中间元素.由于列表已经排序,因此该中间元素是列表的真实中值.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
22886 次 |
| 最近记录: |