阅读本文能学到什么
- 算法不断精进过程
- 知识如何融会贯通
- Python
- NumPy
- 如何对标学习
华为8000名Python开发者
老码农:小码匠,华为要培养8000名开发者,学习免费!实践免费!辅导免费!机会难得啊!
小码匠:你提到的华为,是刚回国的女英雄孟晚舟所属公司华为吗?
老码农:是啊。
小码匠:华为要培养8000名Python开发这事,你那么激动干嘛?和你没啥关系的,因为你有点老。
老码农:,和你有关系啊。
小码匠:
老码农:
- 说明我给你选的方向没错啊
- 说明你很辛福啊,有这么一个有前瞻性的老爸啊
小码匠:说半天,就是夸你自己很有眼光呗。
老码农:这个活动你感兴趣不?我给你报个名吧?和高手们一起切磋,进步快!列夫托尔斯泰说的。
与人交谈一次,往往比多年闭门劳作更能启发心智。
中位数
小码匠:话说今天做什么算法?
老码农:今天这个简单,获取一个数值型列表中位于中间的值,即中位数
百科中是这样定义的:中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。
小码匠:是先排序,取中间的值吗?
老码农:理解能力不错,做码匠确实是你最佳选择。
小码匠:那要偶数个数怎么办啊?
老码农:取中间2个值的平均数就可以。
小码匠:嗯,明白了。
老码农:需求问的很清楚,喜欢你这样的学生,值得赞扬
小码匠,噼里啪啦,虐完键盘,代码呈现如下:
代码语言:javascript复制def median(input_list: list) -> float:
input_list.sort()
if len(input_list) % 2 == 1:
return input_list[len(input_list) // 2]
else:
return (input_list[len(input_list) // 2] input_list[len(input_list) // 2 - 1]) / 2
if __name__ == "__main__":
print(median([60, 10, 20, 30, 40, 50]))
老码农:快手小码匠。不过,你这个,看着有点闹心代码有些啰嗦啊。推荐你看一本书《代码整洁之道》。
小码匠:我不想看,你对新手要求太高了吧,我才学不足2个月啊。
老码农:必须要对自己的小孩负责,不是谁都有你这个待遇的。
小码匠:你是不是说取长度那块太啰嗦了啊。
老码农:是滴。
小码匠飞动手指,又是一阵噼里啪啦。代码呈现如下:
代码语言:javascript复制def median(input_list: list) -> float:
input_list.sort()
num = len(input_list)
if num % 2 == 1:
return input_list[num // 2]
else:
return (input_list[num // 2] input_list[num // 2 - 1]) / 2
if __name__ == "__main__":
print(median([60, 10, 20, 30, 40, 50]))
老码农:看着比之前舒服多了。再考你一个知识点,用列表的切片怎么搞?
小码匠:这个简单。又是一阵噼里啪啦。代码呈现如下:
代码语言:javascript复制def median(input_list: list) -> float:
input_list.sort()
num = len(input_list)
if num % 2 == 1:
return input_list[num // 2]
else:
return sum(input_list[num // 2 - 1: num // 2 1]) / 2
if __name__ == "__main__":
print(median([60, 10, 20, 30, 40, 50, 70, 80, 90]))
老码农:我想敲你的头。
小码匠:,我又错了吗?
老码农:如果我输入,会咋样?
代码语言:javascript复制 print(mean([]))
小码匠:不好意思,忘记了。
又是一阵噼里啪啦。代码呈现如下:
代码语言:javascript复制def median(input_list: list) -> float:
"""
中位数
href: https://baike.baidu.com/item/中位值/9501969?fr=aladdin
input_list: list[int] 数值型数据列表
returns: float: 中位值
"""
if not input_list:
return 0
input_list.sort()
num = len(input_list)
if num % 2 == 1:
return input_list[num // 2]
else:
return sum(input_list[num // 2 - 1: num // 2 1]) / 2
if __name__ == "__main__":
# print(mean([]))
print(median([60, 10, 20, 30, 40, 50, 70, 80, 90]))
老码农:不好,不好,不够完美我来吧!老码农直接操刀上,又是几声噼里啪啦。
代码语言:javascript复制def median(input_list: list) -> float:
"""
中位数
href: https://baike.baidu.com/item/中位值/9501969?fr=aladdin
input_list: list[int] 数值型数据列表
returns: float: 中位值
"""
if not input_list:
raise ValueError("你输入的是个空列表")
input_list.sort()
num = len(input_list)
if num % 2 == 1:
return input_list[num // 2]
else:
return sum(input_list[num // 2 - 1: num // 2 1]) / 2
if __name__ == "__main__":
print(mean([]))
print(median([60, 10, 20, 30, 40, 50, 70, 80, 90]))
老码农:刚我加的这句能看懂吧。
小码匠:能,在上一个算法题,你为啥不告诉我。
老码农:因为我是一个优秀的老码农啊。。。
小码匠:吹牛,对我还有保留,小心眼。
融会贯通
老码农:再考你个问题:刚学完numpy,用numpy搞搞呗,一行代码就能搞定的。
小码匠:我去查查,刚看完资料,还没怎么敲代码呢,我是金鱼的记忆,只有七秒,需要再加强。小码匠噼里啪啦,翻起了资料。又是一阵噼里啪啦。代码呈现如下:
代码语言:javascript复制import numpy as np
def median2(input_list: list) -> float:
return np.median(input_list)
老码农:不错,不错,有点像我,学习能力还是挺强的。
小码匠:时刻不忘夸你自己,羞不羞啊。
向大牛学习
老码农:再给你看个俄罗斯大牛写的算法代码,一起学习下。
代码语言:javascript复制def median(nums: list) -> Union[int, float]:
"""
Find median of a list of numbers.
Wiki: https://en.wikipedia.org/wiki/Median
>>> median([0])
0
>>> median([4, 1, 3, 2])
2.5
>>> median([2, 70, 6, 50, 20, 8, 4])
8
Args:
nums: List of nums
Returns:
Median.
"""
sorted_list = sorted(nums)
length = len(sorted_list)
mid_index = length >> 1
return (
(sorted_list[mid_index] sorted_list[mid_index - 1]) / 2
if length % 2 == 0
else sorted_list[mid_index]
)
留作业
老码农:再给你提2个小问题,开动你的小脑袋瓜,思考下呗。
- 列表sort和sorted的区别?
- 其实你写得很不错了,但你肯定更有追求,读懂他的代码,找找小差距?
小码匠:变相说我不如他呗,哼,等着瞧吧。
老码农:看明白大牛的代码,告诉我你思考结果啊。
一枚聪明的小码匠,加油啊。。。
END