流畅的Python---list排序和保持有序序列
1. 列表 使用 list.sort方法 和内置函数 sorted 排序
不管是list.sort还是sorted函数,list.sort会就地排序列表,不会把列表复制一份,sorted会产生新的对象,有两个可选关键参数:reverse 和 key。
reverse:ture为降序。默认为false,为升序。
key: 排序算法依赖的对比关键字。比如:key=str.lower 实现忽略大小写的排序 , key=len 实现字符串长度的排序,默认的是恒等函数,也就是默认使用元素的值排序。
# 水果list
fruits = ['grape', 'raspberry', 'apple', 'banana']
# 获取对象内存地址
print(id(fruits))
# 使用list.sort默认排序
fruits.sort()
# 查看效果
print(fruits)
# 使用内置sorted函数默认排序
print(sorted(fruits))
# 获取对象内存地址
print(id(fruits))
# 获取对象内存地址
print(id(sorted(fruits)))# 结果
# 1597512311304
# ['apple', 'banana', 'grape', 'raspberry']
# ['apple', 'banana', 'grape', 'raspberry']
# 1597512311304
# 1597512311368
list.sort(key= ,reverse = ) 与sorted(list, key = , reverse = )等可选参数的排序,可自行尝试结果。
2. 使用bisect 保持已排序列
bisect是一个模块,这个模块中主要包括两个函数:bisect 和 insort 。这两个函数都是使用二分查找算法对有序序列中查找或插入元素。
注意:必须是已经排好序的有序序列。
模块bisect中bisect函数:bisect(有序序列L,想搜索的值x),返回x可以插入L中的index,(所以说,如果是升序的情况下,返回的index前边的值都是小于或等于x的值),index是有序序列中的索引。
找到index后再使用L.insert(index,想搜索的值x)插入新值x。
我们也可以使用模块bisect中insort函数一步到位。
# 引入bisect模块
import bisect
# import sys# 制作一有序序列 HAYSTACK
HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
# 想要插入HAYSTACK中的值
NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
# 打印输出,format用法 ,2d补足宽度为2
ROW_FMT = '{0:2d} @ {1:2d} {2}{0:<2d}'
# 写一个demo函数打印效果
def demo(bisect_fn):# 将需要插入的数 一个一个的遍历for needle in reversed(NEEDLES):# 返回可插入的位置position = bisect_fn(HAYSTACK, needle)# 位置数从1开始,所以打印将前方的数都置为 |offset = position * ' |'# 填充数据print(ROW_FMT.format(needle, position, offset))if __name__ == '__main__':bisect_fn = bisect.bisectprint('DEMO:', bisect_fn.__name__)print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))demo(bisect_fn) # 结果
# DEMO: bisect_right
# haystack -> 1 4 5 6 8 12 15 20 21 23 23 26 29 30
# 31 @ 14 | | | | | | | | | | | | | |31
# 30 @ 14 | | | | | | | | | | | | | |30
# 29 @ 13 | | | | | | | | | | | | |29
# 23 @ 11 | | | | | | | | | | |23
# 22 @ 9 | | | | | | | | |22
# 10 @ 5 | | | | |10
# 8 @ 5 | | | | |8
# 5 @ 3 | | |5
# 2 @ 1 |2
# 1 @ 1 |1
# 0 @ 0 0
可通过bisect中两个可选参数:lo和hi 缩小收缩范围
这种使用方式在很多地方都使用的上,例如:一个人的各科成绩要转换成对应的 成绩 等级,4行代码解决问题
def grade(score,breakpoints=[60, 70, 80, 90],grades='FDCBA'):i = bisect.bisect(breakpoints, score)return grades[i]
print([grade(score) for score in [33, 99 ,77 ,70 , 89, 90, 100]])
# 结果
# ['F', 'A', 'C', 'C', 'B', 'A', 'A']
用bisect.insort插入新元素
import bisect
import randomSIZE = 7
# seed改变随机数生成器的种子,使每次结果相同
random.seed(1729)
my_list = []
for i in range(SIZE):# 0到SIZE*2选取一个随机数new_item = random.randrange(SIZE*2)bisect.insort(my_list, new_item)print('%2d ->' % new_item,my_list)
# 结果
# 10 -> [10]
# 0 -> [0, 10]
# 6 -> [0, 6, 10]
# 8 -> [0, 6, 8, 10]
# 7 -> [0, 6, 7, 8, 10]
# 2 -> [0, 2, 6, 7, 8, 10]
# 10 -> [0, 2, 6, 7, 8, 10, 10]
转载于:https://www.cnblogs.com/coylee/p/10744226.html
流畅的Python---list排序和保持有序序列相关推荐
- python中属于有序序列的有_流畅的Python---list排序和保持有序序列
1. 列表 使用 list.sort方法 和内置函数 sorted 排序 不管是list.sort还是sorted函数,list.sort会就地排序列表,不会把列表复制一份,sorted会产生新的对象 ...
- 流畅的Python学习
流畅的Python笔记 流畅的Python笔记 1 Python数据模型 2 数据结构 2.1 内置序列类型 2.2 列表推导与生成器表达式 2.3 元组 2.4 切片 2.5 序列对象上的+与* 2 ...
- 【读书笔记】 《流畅的python》2.7-2.8 读书笔记
2021-09-02 <流畅的python>2.7-2.8 读书笔记 一.list.sort方法和内置函数sorted list.sort 方法会就地排序列表,也就是说不会把原列表复制一份 ...
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基 著 18财税3班 李潇潇 译 日期:2019年5月6日 一. 使用sorted() ...
- 《流畅的Python》一副扑克牌中的难点
1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ...
- python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...
- python实现排序算法_数据结构之(3)python实现排序算法
常用排序与插入算法 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直 ...
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- python常见排序算法解析
python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...
最新文章
- VTK:Math之NormalizeVector
- ACM团队周赛题解(2)
- Part Ⅳ Shopping 购物??
- aux 参数 linux,Linux下ps aux解释
- 计算机网络工程教程:基于cisco路由器和交换机,网络工程实践教程:基于Cisco路由器与交换机...
- 全面解决交通难题,智慧大脑助力城市创建智慧交通管理体系
- GetShell的姿势总结
- PostgreSQL修炼之道之PostgreSQL安装与配置(二)
- 音频怎么转换mp3格式?
- 路由器怎么用自己的笔记本电脑进行配置
- python import文件后 core dumped_python numpy包调用core dumped、Linux VDSO机制
- python判断手机号运营商_python手机号码运营商归属测试
- Proximity Based IoT Device Authentication翻译与理解
- python漫画爬虫:我不做人了,b站!爬取辉夜大小姐等漫画
- python 添加半透明水印_怎么利用python给图片添加半透明水印
- 计算机组装小白,小白怎么从零开始学组装电脑?
- 腿姐22考研政治马原选择题技巧精讲
- 基于Android的3G手机网络摄像机客户端软件设计
- NumberUtils简单介绍和具体实例
- Movist Pro for mac如何同时查看多个字幕?
热门文章
- matlab 指定路径保存图片_关于matlab图片保存方式
- 因分辨率变化html页面布局跳动_Web前端页面设计流程及注意事项,谨记!
- 前端开发中如何将文件夹中的图片变为背景图_如何用Elementor设计banner
- mysql decimal_MySQL系列之数据类型及约束
- C陷阱与缺陷阅读笔记(下)
- 纯新手DSP编程--5.31--DSP/BIOS中的数据交换
- linux 的学习笔记 tree ifconfig
- 单片机tcp异常处理_TCP三次握手、四次挥手出现意外情况时,为保证稳定,是如何处理的...
- “21天好习惯”第一期-9
- NoSQL的分类入门