用 python 优雅实现:序列 A 依照序列 B 排序
序列排序是日常开发常见的需求。实现方式有很多,哪种方式最简洁明了?
需求:已知序列 A、B 拥有相同的元素,要求序列 A 依照序列 B 排序进行排序。
冒泡排序
通过重复遍历待排序列表,比较相邻元素,交换顺序错误的元素,逐步将最大或最小的元素“冒泡”到列表的一端,就像气泡在液体中上升一样。
使用内置函数 sorted
相对于冒泡排序,内置函数 sorted 简洁而高效。
简洁:如下使用少量的代码,实现等效的排序。
高效:sorted 函数是线性对数时间复杂度 𝑂(𝑛log𝑛),冒泡算法属于平方时间复杂度 𝑂(𝑛2)。排序的数量级越大,sorted 函数优势越明显。
PS: Python 内置的 sorted 函数以及列表的 sort 方法都使用了一种叫做 Timsort 的排序算法。以下是 sorted 函数的详细介绍及其使用方法:
sorted(iterable, key=None, reverse=False)
iterable: 这是必需参数。可以是任何可迭代对象,如列表、元组、字符串、字典等。 key: 这是一个可选参数。它是一个函数,作用于 iterable 参数中的每一个元素,sorted 函数将使用该函数的返回值进行排序。 reverse: 这是一个可选参数。它是一个布尔值。如果设置为 True,则按照降序排序。默认为 False(升序排序)。
适配元素不存在情况
生产环境中,可能存在序列 A 中元素不在序列 B 中。对于这种情况,使用以上代码会抛出异常。
例如:
根据墨菲定律(如果有什么事情可能出错,那么它就很有可能会出错),应该进行防御式编程,做相应适配。
使用 if 做预先判断
使用 try except 捕获异常
转换成字典使用 get 方法
总结
对比三种方式:
性能:字典方法 (get) 最优,if 判断其次,try-except 最差。
可读性:if 判断和字典方法较好,try-except 相对较差。
空间复杂度:字典方法需要额外空间,其它两种方法不需要。
异常处理在 Python 中相对较慢 python 字典因为使用哈希表(Hash Table)这种数据结构的原因,时间复杂度是常量级的。是一种以空间换时间的实现方式。优点是速度非常快,缺点是消耗额外内存。
综合考虑性能和可读性,使用字典转换 (get 方法) 是三者中最优的选择。它在性能上占据优势,并且代码简洁直观,易于维护。
作者:程序员非鱼
链接:https://juejin.cn/post/7371422530958049291
评论