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.bisect

print('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 random

SIZE = 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]

python中属于有序序列的有_流畅的Python---list排序和保持有序序列相关推荐

  1. python中的常量可以修改吗_深入理解Python变量与常量

    变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中.常量是一块只读的内存区域,常量一旦被初始化就不能被 ...

  2. python中ifelifelse用在什么结构_详解Python if-elif-else知识点

    有的时候,一个 if - else - 还不够用.比如,根据年龄的划分:条件1:18岁或以上:adult 条件2:6岁或以上:teenager 条件3:6岁以下:kid Python if-elif- ...

  3. python中变量不需要事先声明_第二章 Python 变量

    2.1  Python变量 在 Python 中变量不需要事先声明变量名及其类型,直接赋值即可创建各种变量(不要使用关键字为变量名),例如: >>>x = 4 >>> ...

  4. python中控制代码块逻辑关系_一、Python基础知识

    1.1 Python简介 (1)解释型语言 解释型语言在运行程序的时候才逐行翻译.运行. ①优点: 有良好的平台兼容性,在任何环境中都可以运行(安装了解释器)灵活,修改代码的时候直接修改就可以,可以快 ...

  5. python中用于循环结构的关键字_详解Python的循环结构知识点

    循环结构的应用场景 如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令.当然你可能已经注意 ...

  6. python中最常用的映射类型_什么是python中唯一的映射类型

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  7. python中字典和json的区别_详解python中的json和字典dict

    定义 python中,json和dict非常类似,都是key-value的形式,而且json.dict也可以非常方便的通过dumps.loads互转.既然都是key-value格式,为啥还需要进行格式 ...

  8. python中heapq的库是什么_详解Python中heapq模块的用法

    详解Python中heapq模块的用法 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  详解Python中heapq模块的用法.txt ] (友情提示:右键点上行t ...

  9. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

  10. python中range和arange的区别_浅谈Python中range与Numpy中arange的比较

    本文先比较range与arange的异同点,再详细介绍各自的用法,然后列举了几个简单的示例,最后对xrange进行了简单的说明. 1. range与arange的比较 (1)相同点:A.参数的可选性. ...

最新文章

  1. Linux(Contos7.5)环境搭建之Gitblit安装(三)
  2. cocos2dx 2.2.5 hitWidget-onTouchEnded(pTouch, pEvent); 异常
  3. 软件工程练习:模块化,单元测试,回归测试,TDD
  4. influxdb聚合函数JAVA_InfluxDB 聚合函数实用案例
  5. 马化腾卸任财付通网络小贷公司董事长、总经理
  6. Java题目筛选器_【024期】JavaWeb面试题(五):Filter和Listener
  7. Android使用init.rc触发脚本实现隐藏内置应用
  8. 思科 计算机网络 期末考试答案
  9. 算法题解 - 牛客编程巅峰赛S1第4场 - 黄金钻石组
  10. Laravel自定义webpack.mix.js
  11. nodejs实现桌面程序exe
  12. python技巧积累
  13. 洛谷P1510 精卫填海(简单的dp)
  14. 关于无损APE,FLAC转AAC的小技巧
  15. MySQL高可用之DRBD
  16. 如何在阿里云开通云服务器
  17. 如何评价B端产品经理的能力
  18. 袁老师Py西游攻关之基础数据类型
  19. 布局光刻机核心器件,华为哈勃投资入股科益虹源
  20. 江西计算机对口升学试题,2020年江西三校生对口升学考试真题+答案

热门文章

  1. Linux下安装Firefox flash插件
  2. 金融+IT:作为国内首家智能投顾,理财魔方怎么玩?
  3. python怎样输出字符串和数字_Python 字符串和数字
  4. 如何实现园区智慧化数字化运营管理?
  5. 我的世界服务器java启动脚本_我的世界自动重启脚本教程
  6. 读万卷书,不如行万里路-壮游的教育 1
  7. java futuretask 状态_java并发编程之FutureTask
  8. ASP.NET下利用HttpModule实现简体中文向繁体中文的自动转换
  9. Python采集热门城市景点数据+简单制作数据可视化图
  10. 【MySql】mysql之基础语句