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爱好者社区 列表 列表,可以是这样的: 分享了一波我的网易云音乐列表 今天 ...
随机推荐
- this到底指向哪里
this指向调用它的对象 首先要明确,this指向调用方,谁调用,this指向谁. 直接调用 举个栗子: var test = 'window' ; function testThis () { va ...
- 结束《Java编程思想》(Thinking in Java)自学的读后感(2017.10.15)
首先划重点:这是一本Java的入门书. 自学前需要的条件:已经具备基本的计算机基础. 1)已经对一种编程语言比较熟悉: 2)有过四年计算机专业学习,或者三年以上的软件开发经验, 自学的方法: 1)完全 ...
- hdu5696 区间的价值
区间的价值 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R-L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大 ...
- 张高兴的 Windows 10 IoT 开发笔记:ToF Sensor VL53L0X
GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/VL53L0X
- Python C++扩展
Python C++扩展 前段时间看了一篇文章,http://blog.jobbole.com/78859/, 颇有感触,于是就结合自己工作中的知识作了一个简单的Python移动侦测:移动侦测的算法使 ...
- BZOJ-1045-[HAOI2008] 糖果传递(中位数原理)
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...
- Golang开发者常见的坑
Golang开发者常见的坑 目录 [−] 初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accid ...
- struts2国际化相关问题
国际化资源文件的方式: Action范围的 包范围的 临时的 全局的(推荐) 一.配置全局的国际化资源文件 1.在类路径下,创建国际化资源文件 baseName.properties baseName ...
- 一起来学linux:SSH远程登陆
p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 在最早的远程连接技术,主要是telnet和RSH为主.缺点也很明显,就是明文传输.在 ...
- Python Fabric远程自动部署简介
Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务. 它提供的操作包括:执行本地或远程shell命令,上传/下载文件,以及其他辅助功能,如提示用户输入. ...