作为家庭作业,我必须编写一个脚本,找到3个给定数字的中位数,而不使用Python的标准排序函数。
这是我上课的第一周和我的第一次编程经历,所以我觉得很难比现在更进一步。
这是我到目前为止所拥有的:
def med3(a,b,c):
list = [a, b, c]
newlist = []
if list:
minimum = list[0]
for x in list:
if x < minimum:
minimum = x
newlist.append(minimum)
list.remove(minimum)
elif x >= minimum:
newlist.append(x)
list.remove(x)
return newlist[1]
这似乎可以解决问题,但仅适用于列表的前两个条目。循环不包括第三个条目。
如何让脚本包含所有三个条目?
提前致谢! 桑德
答案 0 :(得分:6)
sum([a, b, c]) - min(a, b, c) - max(a, b, c)
- 没有排序!
答案 1 :(得分:0)
您正在循环修改列表,这会对您看到的元素产生影响:
>>> numbers = [1,2,3]
>>> for i in numbers:
... if i == 2: numbers.remove(i)
... print i
...
1
2
请注意永远不会打印3
;通过删除列表中的第二个条目,我们将其缩短了一个元素,并且循环找到了早期耗尽的列表。
请注意,您不需要 来循环播放这些项目,一些简单的比较会告诉您,如果您考虑一下,该项目的中位数是什么。 : - )
答案 2 :(得分:0)
有许多更简单的方法可以解决这个问题,但至于你的方法:
您正在修改循环中的list
。不要那样做。 :)
在您的情况下,您应该从新列表中删除元素:
def med3(a,b,c):
list = [a, b, c]
newlist = []
if list:
minimum = list[0]
for x in list:
if x < minimum:
minimum = x
newlist.pop()
newlist.append(minimum)
elif x >= minimum:
newlist.append(x)
return newlist[1]
但作为练习,你可能想要考虑一些事情:
为什么要将元素放在列表中并循环遍历它们?与简单的if语句比较a,b,c有什么优势?
为什么if list:
?
答案 3 :(得分:0)
最快的方法:
def medianFast(a, b, c):
if a > b:
if b > c:
return b
elif a > c:
return c
else:
return a
else:
if b < c:
return b
elif a > c:
return a
else:
return c
在最坏的情况下保证3次比较,在最好的情况下保证2次比较。 2,5平均比较。
使用ternary conditional我们可以将其缩短为:
def medianTernary(a, b, c):
return (b if b > c else (c if a > c else a)) if a > b else (b if b < c else (a if a > c else c))
如果你可以使用排序,你将拥有最短的版本:
def medianSorted(a, b, c):
return sorted([a, b, c])[1]