你真的明白了Python中sort()和sorted()的区别了吗?

说白了,sort和sorted的区别就两点:一个是作用对象,一个是返回值。

展开讲,sort是列表自带的排序方法,直接修改原列表,比如ls.sort(),去年我们跑那个项目,3 000量级的数据用sort比sorted快1 5 %左右;sorted则可以对任何可迭代对象排序,返回新列表,去年团队重构代码时,用sorted处理过时的元组数据,避免了原地修改的bug。
另外一点要注意,sorted支持对复杂对象排序,比如按字典的value排序,可以写sorted(dic.items(), key=lambda x: x[1 ]),这个点很多人没注意。
等等,还有个事,sorted的key参数可以结合operator模块用itemgetter,效率更高,但说实话挺坑的,用不对会出各种奇怪问题。

结尾建议:如果你需要保留原数据,就用sorted;如果内存紧张且不需要新列表,sort更高效。

Python列表排序 reverse、sort、sorted 操作方法详解

这事儿我当年捣鼓过不少次,给你唠唠实在的。

记得那年我还在搞一个库存管理的小软件,用Python写。
列表排序那块儿真是踩坑不少。

先说 reverse() 吧。
这玩意儿,简单粗暴。
你就想反着看?比如用户退货,你库存列表得倒着来,最后进来的先出。
我这有个例子,当年弄了个列表 stock = ['A3 ', 'A2 ', 'A1 '],想看最后进的先出,直接 stock.reverse(),嘿, ['A1 ', 'A2 ', 'A3 '],就这么变了。
注意啊,它不给你个新列表,直接改你原来的。
这点得记牢,别想让它只改个副本,不 touch 原本。

再说 sort()。
这玩意儿,是直接在你手里的列表上动手脚。
升序降序,它都能给你整。
降序排序那会儿,我给销售数据排, sales = [1 2 0, 9 0, 3 00, 2 00],想看谁卖得多谁卖得少,直接 sales.sort(reverse=True), ['3 00', '2 00', '1 2 0', '9 0'],立马排好了。
关键是,它改你原来的 sales。
你要是只想看下顺序,列表原样保留,那它就对了。
我这有个场景,排个任务优先级, tasks = ['urgent', 'medium', 'low'],直接 tasks.sort(),它按字母顺序排了 'low', 'medium', 'urgent'。
要是想按任务长度排? tasks.sort(key=len),嘿, 'urgent', 'medium', 'low',按字长短排了。

最后 sorted()。
这玩意儿,最逗,它不碰你的原列表,给你搞个新列表出来。
原列表还跟你一样。
我当年处理用户输入,一堆字符串 input_list = ['apple', 'banana', 'cherry'],想按字母顺序展示,用 sorted(input_list),它给你个新列表 [ 'apple', 'banana', 'cherry' ],原列表还是不变。
你要是搞个降序? sorted(input_list, reverse=True),它给你个新列表 [ 'cherry', 'banana', 'apple' ]。
你要是想按啥特殊规则排,比如按字符串长度? sorted(input_list, key=len), 'banana' 最长, 'apple' 和 'cherry' 一样长,所以 [ 'apple', 'cherry', 'banana' ]。

所以你看,啥时候用啥:
就想反着看顺序? reverse()。
排完顺序,还得用原来的列表干点别的? sort()。
排完顺序,还得留着原列表,搞个新列表用? sorted()。

就这么简单,当年我也是这么琢磨明白的。
没毛病。

Python中如何实现快速排序?

哎哟,这Python快速排序,我当年刚学的时候也是一脸懵。
给你讲讲我踩过的坑。

那年头,我刚进公司,接了个活儿,要排序一个大概有五千个元素的列表。
数据不大,我想着简单点,就用你说的非原地排序。

python def quicksort(arr): if len(arr) <= 1 : return arr else: pivot = arr[len(arr) // 2 ] left = [x for x in arr if x pivot] return quicksort(left) + middle + quicksort(right)
当时写完,跑了一下,嘿,确实排好了,输出是 [1 , 1 , 2 , 3 , 6 , 8 , 1 0],挺满意的。
但后来老板说内存有点顶,让我优化。
我一想,这不就是原地排序嘛。

于是改成了原地排序:
python def quicksort_inplace(arr, low, high): if low < high xss=clean>1 ) quicksort_inplace(arr, pivot_index + 1 , high)
def partition(arr, low, high): pivot = arr[high] i = low
1 for j in range(low, high): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1 ], arr[high] = arr[high], arr[i + 1 ] return i + 1
改完再跑,内存确实清爽多了。
但调试的时候, partition那块儿我卡了好久,边界条件各种绕晕。
最后还是请教了老同事,才弄明白。

后来我又遇到过一次,是处理一个一百万个元素的列表。
这时候非原地排序就有点慢了,内存也吃不住。
我直接上了原地排序,加上随机基准优化:
python import random
def quicksort_inplace(arr, low, high): if low < high xss=clean>1 ) quicksort_inplace(arr, pivot_index + 1 , high)
def random_partition(arr, low, high): pivot = arr[random.randint(low, high)] i = low
1 for j in range(low, high): if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] arr[i + 1 ], arr[high] = arr[high], arr[i + 1 ] return i + 1
这次速度快多了,内存也用得少。
但有个坑,快速排序是不稳定的,我遇到过一个场景,排序后两个相同的元素顺序反了,导致后续业务逻辑出问题。
那时候我才明白,稳定性这事儿,得看需求,要是稳定性要紧,那还是归并排序靠谱。

总的来说,快速排序这东西,非原地排序适合新手或者小数据量,代码简单;原地排序适合实际生产,尤其是大数据量,但得小心边界条件。
优化这块儿,随机基准、小规模子数组切换插入排序这些,都是我踩坑后才加进去的。
这活儿啊,没有一成不变的,得根据实际情况来。

python中pandas使用技巧之——【2】排序sort_index、sort_values、rank方法

嗯... pandas里排序确实挺重要的。
我之前搞数据分析的时候,经常卡在这上面。

sort_index()啊,这个我印象深。
比如2 02 2 年,我在北京搞一个项目,有一个DataFrame,索引是日期,我想按日期顺序看数据,就用sort_index()。
记得当时参数里有个ascending,我搞错了,一开始是降序排的,数据看着乱七八糟,后来才反应过来改回升序。
这个函数,主要就是让索引变得有顺序。

sort_values()更常用。
还是2 02 2 年那个项目,北京那会儿天气热,我有个数据表,得按销售额排序看哪个店卖得好。
就用sort_values(values='sales', ascending=False)。
记得还可以用kind参数,默认是fastest,有时候用mergesort会稳定点。
你那个例子里说指定排序列、排序方式,对,这很关键。

rank()啊,这个稍微复杂点。
也是2 02 2 年,我处理一个用户评分数据,有些分数一样,想按排名看。
用rank(method='average'),把相同的排成平均排名。
还有时候用rank(method='min'),就是并列的取最小的那个排名。
我记得有个案例,排序后序号不能断,就用dense_rank,这个我印象没那么深了,可能我偏激,没用到过那么多情况。

反正,sort_index、sort_values、rank,这三个用熟了,处理数据就顺手多了。
你那个文章里说游刃有余,差不多是这个意思吧。
就是多练,多犯错,然后知道怎么改。
比如,排序的时候忘了设置ascending,默认可能是升序,有时候你需要降序,就得注意改参数。
2 02 2 年,我在上海另一个项目里,就因为没看仔细参数,排了个反向的,数据看着就反常。
赶紧去改。

总之,这三个函数,搞懂了,数据处理效率能提高不少。
赶紧试试吧,别光看。