Python之数据类型-[bisect,heap]
bisect
>>> import bisect
>>>
>>> b = [ 20, 34, 35, 65, 78 ]
>>>
>>> bisect.bisect(b,25) #查找25在列表中的合适插入位置
1
>>>
>>> b
[20, 34, 35, 65, 78]
>>>
>>> bisect.bisect_left(b,35) #如果待查找元素在列表中存在,则返回左侧插入位置
2
>>>
>>> bisect.bisect_right(b,35)#如果待查找元素在列表中存在,则返回右侧插入位置
3
可以直接用insort_left()直接插入元素而非查找
>>> b
[20, 34, 35, 65, 78]
>>> bisect.insort_left(b,25)
>>>
>>> bisect.insort_left(b,40)
>>> b
[20, 25, 34, 35, 40, 65, 78]
>>> def Sorted_list(list,*elment):
... for e in elment:
... bisect.insort_left(list,e)
... return list
...
>>> Sorted_list([],3,2,1)
[1, 2, 3]
>>> Sorted_list([],8,9,10,4,5,3,2,1)
[1, 2, 3, 4, 5, 8, 9, 10]
>>>
使用bisect实现一个Sorted_list
http://docs.python.org/2.7/library/bisect.html#module-bisect
思考:如果使用bisect来实现ConsistentHashing算法,只要找到Key在Ring上的插入位置,其下一个有效元素就是我们的目标服务器配置??
heapq
最小堆:完全平衡二叉树,所有节点都小于其子节点
http://docs.python.org/2.7/library/heapq.html#module-heapq
堆的意义:最快找到最大/最小值。在堆结构中插入或删除最小(最大)元素时进行重新构造时间复杂度为O(logN),而其他方法最少为O(N)。堆在实际开发中的更倾向于算法调度而非排序。比如优先级调度时,每次取优先级最高的;时间驱动调度时,取时间最小或等待最长的等等
>>> from heapq import *
>>> from random import *
>>>
>>> rand = sample(xrange(1000),10) #生成随机数序列
>>> rand
[65, 130, 964, 675, 422, 74, 93, 386, 213, 596]
>>>
>>> heap = []
>>> for x in rand:
... heappush(heap,x) #将随机数压入堆
...
>>> heap #堆是树,并非排序列表
[65, 130, 74, 213, 422, 964, 93, 675, 386, 596]
>>> while heap:
... print heappop(heap) #总弹出最小的元素
...
65
74
93
130
213
386
422
596
675
964
其他函数:
将列表转换为堆
>>> array = sample(xrange(1000),10) #生成一个列表
>>> array
[943, 536, 93, 400, 736, 184, 876, 854, 988, 345]
>>> heapify(array) #将列表转换为堆
>>> array #有序化
[93, 345, 184, 400, 536, 943, 876, 854, 988, 736]
合并两个有序序列
>>> a = range(1,10,2)
>>> a
[1, 3, 5, 7, 9]
>>> b = range(2,10,2)
>>> b
[2, 4, 6, 8]
>>>
>>> [x for x in merge(a,b)] #合并有序序列
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'merge' is not defined
#错误原因在于import heapq,而不是from heapq import *
>>> [x for x in heapq.merge(a,b)] #合并有序序列
[1, 2, 3, 4, 5, 6, 7, 8, 9]
取出n个最大元素:
>>> d = sample(xrange(100),10)
>>> d
[9, 82, 95, 96, 11, 15, 29, 14, 53, 2]
>>> heapq.nlargest(5,d)
[96, 95, 82, 53, 29]
>>> heapq.nsmallest(5,d)
[2, 9, 11, 14, 15]
利用元组__cmp__,用数字表示对象优先级,实现优先级队列:
>>> from heapq import *
>>> from string import *
>>> from random import *
>>>
>>> data = map(None,sample(xrange(100),10),sample(letters,10))
>>>
>>> data
[(30, 'T'), (24, 'E'), (23, 'r'), (62, 'm'), (81, 'W'), (91, 'b'), (83, 'S'), (80, 'h'), (65, 'i'), (64, 'D')]
>>>
>>>
>>> heap=[]
>>>
>>> for item in data:heappush(heap,item)
...
>>> heap
[(23, 'r'), (30, 'T'), (24, 'E'), (62, 'm'), (64, 'D'), (91, 'b'), (83, 'S'), (80, 'h'), (65, 'i'), (81, 'W')]
或者重载自定义类型的__cmp__操作符。
如果自定义重载呢?
http://www.cnblogs.com/linyawen/archive/2012/04/11/2442424.html
Python之数据类型-[bisect,heap]的更多相关文章
- python 基本数据类型分析
在python中,一切都是对象!对象由类创建而来,对象所拥有的功能都来自于类.在本节中,我们了解一下python基本数据类型对象具有哪些功能,我们平常是怎么使用的. 对于python,一切事物都是对象 ...
- python常用数据类型内置方法介绍
熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 下面介绍了python常用的集中数据类型及其方法,点开源代码,其中对主要方法都进行了中文注释. 一.整型 a = 100 a.xx ...
- python笔记之bisect模块
python笔记之bisect模块 当你决定使用二分搜索时,这个模块会给你带来很大的帮助. 例子 import bisect L = [1,3,3,6,8,12,15] x = 3 #在L中查找x,x ...
- 闲聊之Python的数据类型 - 零基础入门学习Python005
闲聊之Python的数据类型 让编程改变世界 Change the world by program Python的数据类型 闲聊之Python的数据类型所谓闲聊,goosip,就是屁大点事可以咱聊上 ...
- python自学笔记(二)python基本数据类型之字符串处理
一.数据类型的组成分3部分:身份.类型.值 身份:id方法来看它的唯一标识符,内存地址靠这个查看 类型:type方法查看 值:数据项 二.常用基本数据类型 int 整型 boolean 布尔型 str ...
- Python入门-数据类型
一.变量 1)变量定义 name = 100(name是变量名 = 号是赋值号100是变量的值) 2)变量赋值 直接赋值 a=1 链式赋值 a=b=c=1 序列解包赋值 a,b,c = 1,2,3 ...
- Python基础:八、python基本数据类型
一.什么是数据类型? 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能,计算机虽然很强大,但从某种角度上来看又很傻,除非你明确告诉它,"1"是数字,"壹&quo ...
- python之数据类型详解
python之数据类型详解 二.列表list (可以存储多个值)(列表内数字不需要加引号) sort s1=[','!'] # s1.sort() # print(s1) -->['!', ' ...
- Python特色数据类型(列表)(上)
Python从零开始系列连载(9)——Python特色数据类型(列表)(上) 原创 2017-10-07 王大伟 Python爱好者社区 列表 列表,可以是这样的: 分享了一波我的网易云音乐列表 今天 ...
随机推荐
- Weave Scope 容器地图 - 每天5分钟玩转 Docker 容器技术(80)
Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解.监控和控制容器.千言万语不及一张图,先感受一下. 下面开始实践 Weave Scope. 安装 执行如 ...
- mysql导出数据库和恢复数据库代码
mysql导出数据库和备份数据库 用mysqldump 命令行 命令格式 mysqldump -u 用户名 -p 数据库名 > 数据库名.sql 范例: mysqldump -uroot -p ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- MySql5.7创建数据库与添加用户、删除用户及授权
MySql安装启动成功后(不会的可以查看上篇MySql5.7安装及配置),首先我们需要创建数据库,然后创建一个用户去操作这个数据库: 一.创建数据库 在MySql命令行中输入: create data ...
- servlet 相应头重定向
package demoservllet; import java.io.IOException;import javax.servlet.ServletException;import javax. ...
- Java简单知识梳理
1. Java是单根继承结构:每个类都继承于Object类 ,这也就保证了每个对象都具备某些功能 2. Java类权限关键字: public -> protected -> default ...
- LINUX 笔记-top命令
top命令经常用来监控linux的系统状况,比如cpu.内存的使用. top - :: up day, :, users, load average: 0.00, 0.01, 0.00 Tasks: ...
- 【UML 建模】活动图介绍
1.活动图,即Activity Diagram,是UML中用于对系统的动态行为建模的一种常用工具,它描述活动的顺序,展现从一种活动到另一种活动的控制流.其本质上是一种流程图,着重表现从一个活动到另一个 ...
- EF6与Mysql疑难问题记录
这几天公司架构调整,新的迭代后端使用了ABP框架与CodeFirst模式,执行过程中遇到了一个非必现很难定位的问题,特此记录. 现象 在程序访问MySql数据库时报了异常 System.Invalid ...
- C#设计模式之十组合模式(Composite)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第四个模式,该模式是[组合模式],英文名称是:Composite Pattern.当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达 ...