当前位置: 首页 > news >正文

Python 序列构成的数组(list.sort方法和内置函数sorted)

list.sort方法和内置函数sorted

list.sort 方法会就地排序列表,也就是说不会把原列表复制一份。这
也是这个方法的返回值是 None 的原因,提醒你本方法不会新建一个列
表。在这种情况下返回 None 其实是 Python 的一个惯例:如果一个函数
或者方法对对象进行的是就地改动,那它就应该返回 None,好让调用
者知道传入的参数发生了变动,而且并未产生新的对象。例
如,random.shuffle 函数也遵守了这个惯例。

用返回 None 来表示就地改动这个惯例有个弊端,那就是调用
者无法将其串联起来。而返回一个新对象的方法(比如说 str 里的
所有方法)则正好相反,它们可以串联起来调用,从而形成连贯接
口(fluent interface)。

与 list.sort 相反的是内置函数 sorted,它会新建一个列表作为返回
值。这个方法可以接受任何形式的可迭代对象作为参数,甚至包括不可
变序列或生成器。而不管 sorted 接受的是怎样的参
数,它最后都会返回一个列表。

不管是 list.sort 方法还是 sorted 函数,都有两个可选的关键字参
数。

reverse
如果被设定为 True,被排序的序列里的元素会以降序输出(也就
是说把最大值当作最小值来排序)。这个参数的默认值是 False。

key
一个只有一个参数的函数,这个函数会被用在序列里的每一个元素
上,所产生的结果将是排序算法依赖的对比关键字。比如说,在对一些
字符串排序时,可以用 key=str.lower 来实现忽略大小写的排序,或
者是用 key=len 进行基于字符串长度的排序。这个参数的默认值是恒等函数(identity function),也就是默认用元素自己的值来排序。

可选参数 key 还可以在内置函数 min() 和 max() 中起作用。
另外,还有些标准库里的函数也接受这个参数,像
itertools.groupby() 和 heapq.nlargest() 等。

下面通过几个小例子来看看这两个函数和它们的关键字参数

>>> fruits = ['grape', 'raspberry', 'apple', 'banana']
>>> sorted(fruits)
['apple', 'banana', 'grape', 'raspberry'] ➊
>>> fruits
['grape', 'raspberry', 'apple', 'banana'] ➋
>>> sorted(fruits, reverse=True)
['raspberry', 'grape', 'banana', 'apple'] ➌
>>> sorted(fruits, key=len)
['grape', 'apple', 'banana', 'raspberry'] ➍
>>> sorted(fruits, key=len, reverse=True)
['raspberry', 'banana', 'grape', 'apple'] ➎
>>> fruits
['grape', 'raspberry', 'apple', 'banana'] ➏
>>> fruits.sort() ➐
>>> fruits
['apple', 'banana', 'grape', 'raspberry'] ➑

❶ 新建了一个按照字母排序的字符串列表。
❷ 原列表并没有变化。
❸ 按照字母降序排序。
❹ 新建一个按照长度排序的字符串列表。因为这个排序算法是稳定
的,grape 和 apple 的长度都是 5,它们的相对位置跟在原来的列表里是
一样的。
❺ 按照长度降序排序的结果。结果并不是上面那个结果的完全翻转,
因为用到的排序算法是稳定的,也就是说在长度一样时,grape 和 apple
的相对位置不会改变。
❻ 直到这一步,原列表 fruits 都没有任何变化。
❼ 对原列表就地排序,返回值 None 会被控制台忽略。
❽ 此时 fruits 本身被排序。
已排序的序列可以用来进行快速搜索,而标准库的 bisect 模块给我们
提供了二分查找算法。下一节会详细讲这个函数,顺便还会看看
bisect.insort 如何让已排序的序列保持有序。

相关文章:

  • PostgreSQL数据库重放攻击测试
  • 【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施
  • [ctfshow web入门] web26
  • 通过发票四要素信息核验增值税发票真伪-iOS发票查验接口
  • 第12/100节:关键路径
  • HTTP GET 和 POST 请求有什么区别
  • spring-cloud-starter-alibaba-sentinel使用说明
  • linux--------------进程控制(下)
  • WPF如何修改三方控件库的样式
  • AudioRecord 录制pcm转wav
  • 每日一题(小白)数组娱乐篇17
  • 滑动窗口7:30. 串联所有单词的子串
  • 分布式数据库LSM树
  • 多模态大语言模型arxiv论文略读(七)
  • Unity-Xlua热更和AssetBundle详解
  • 上下拉电阻详解
  • RAG 系统中的偏差是什么?
  • 自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“
  • BetaFlight参数配置解读
  • 软考高项-考前冲刺资料-M 类【项目管理类】【光头张老师出品】
  • 追光|铁皮房、土操场,这有一座“筑梦”摔跤馆
  • 万达电影:股东杭州臻希拟减持不超1.3927%公司股份
  • 昆廷·斯金纳:作为“独立自主”的自由
  • 又一日军“慰安妇”制度受害者去世,大陆登记在册幸存者仅剩7人
  • 十四届全国政协原常委、民族和宗教委员会原副主任苟仲文被提起公诉
  • 潘功胜:降准0.5个百分点,降低政策利率0.1个百分点