我的教授写了这个中值函数,我不太了解它。有人可以解释有关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
从我看到的一个例子中添加,即使是列表长度:
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]
不是浮点数索引吗?我不是一直都这么做的?任何比我更好的解释都非常感激。
答案 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
,这是一个坏主意。
#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]
此外,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