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排序和保持有序序列相关推荐

  1. python中属于有序序列的有_流畅的Python---list排序和保持有序序列

    1. 列表 使用 list.sort方法 和内置函数 sorted 排序 不管是list.sort还是sorted函数,list.sort会就地排序列表,不会把列表复制一份,sorted会产生新的对象 ...

  2. 流畅的Python学习

    流畅的Python笔记 流畅的Python笔记 1 Python数据模型 2 数据结构 2.1 内置序列类型 2.2 列表推导与生成器表达式 2.3 元组 2.4 切片 2.5 序列对象上的+与* 2 ...

  3. 【读书笔记】 《流畅的python》2.7-2.8 读书笔记

    2021-09-02 <流畅的python>2.7-2.8 读书笔记 一.list.sort方法和内置函数sorted list.sort 方法会就地排序列表,也就是说不会把原列表复制一份 ...

  4. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

  5. 《流畅的Python》一副扑克牌中的难点

    1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ...

  6. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)

    简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...

  7. python实现排序算法_数据结构之(3)python实现排序算法

    常用排序与插入算法 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直 ...

  8. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  9. python常见排序算法解析

    python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...

最新文章

  1. VTK:Math之NormalizeVector
  2. ACM团队周赛题解(2)
  3. Part Ⅳ Shopping 购物??
  4. aux 参数 linux,Linux下ps aux解释
  5. 计算机网络工程教程:基于cisco路由器和交换机,网络工程实践教程:基于Cisco路由器与交换机...
  6. 全面解决交通难题,智慧大脑助力城市创建智慧交通管理体系
  7. GetShell的姿势总结
  8. PostgreSQL修炼之道之PostgreSQL安装与配置(二)
  9. 音频怎么转换mp3格式?
  10. 路由器怎么用自己的笔记本电脑进行配置
  11. python import文件后 core dumped_python numpy包调用core dumped、Linux VDSO机制
  12. python判断手机号运营商_python手机号码运营商归属测试
  13. Proximity Based IoT Device Authentication翻译与理解
  14. python漫画爬虫:我不做人了,b站!爬取辉夜大小姐等漫画
  15. python 添加半透明水印_怎么利用python给图片添加半透明水印
  16. 计算机组装小白,小白怎么从零开始学组装电脑?
  17. 腿姐22考研政治马原选择题技巧精讲
  18. 基于Android的3G手机网络摄像机客户端软件设计
  19. NumberUtils简单介绍和具体实例
  20. Movist Pro for mac如何同时查看多个字幕?

热门文章

  1. matlab 指定路径保存图片_关于matlab图片保存方式
  2. 因分辨率变化html页面布局跳动_Web前端页面设计流程及注意事项,谨记!
  3. 前端开发中如何将文件夹中的图片变为背景图_如何用Elementor设计banner
  4. mysql decimal_MySQL系列之数据类型及约束
  5. C陷阱与缺陷阅读笔记(下)
  6. 纯新手DSP编程--5.31--DSP/BIOS中的数据交换
  7. linux 的学习笔记 tree ifconfig
  8. 单片机tcp异常处理_TCP三次握手、四次挥手出现意外情况时,为保证稳定,是如何处理的...
  9. “21天好习惯”第一期-9
  10. NoSQL的分类入门