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]的更多相关文章

  1. python 基本数据类型分析

    在python中,一切都是对象!对象由类创建而来,对象所拥有的功能都来自于类.在本节中,我们了解一下python基本数据类型对象具有哪些功能,我们平常是怎么使用的. 对于python,一切事物都是对象 ...

  2. python常用数据类型内置方法介绍

    熟练掌握python常用数据类型内置方法是每个初学者必须具备的内功. 下面介绍了python常用的集中数据类型及其方法,点开源代码,其中对主要方法都进行了中文注释. 一.整型 a = 100 a.xx ...

  3. python笔记之bisect模块

    python笔记之bisect模块 当你决定使用二分搜索时,这个模块会给你带来很大的帮助. 例子 import bisect L = [1,3,3,6,8,12,15] x = 3 #在L中查找x,x ...

  4. 闲聊之Python的数据类型 - 零基础入门学习Python005

    闲聊之Python的数据类型 让编程改变世界 Change the world by program Python的数据类型 闲聊之Python的数据类型所谓闲聊,goosip,就是屁大点事可以咱聊上 ...

  5. python自学笔记(二)python基本数据类型之字符串处理

    一.数据类型的组成分3部分:身份.类型.值 身份:id方法来看它的唯一标识符,内存地址靠这个查看 类型:type方法查看 值:数据项 二.常用基本数据类型 int 整型 boolean 布尔型 str ...

  6. Python入门-数据类型

    一.变量 1)变量定义 name = 100(name是变量名 = 号是赋值号100是变量的值) 2)变量赋值 直接赋值 a=1 链式赋值  a=b=c=1 序列解包赋值  a,b,c = 1,2,3 ...

  7. Python基础:八、python基本数据类型

    一.什么是数据类型? 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能,计算机虽然很强大,但从某种角度上来看又很傻,除非你明确告诉它,"1"是数字,"壹&quo ...

  8. python之数据类型详解

    python之数据类型详解 二.列表list  (可以存储多个值)(列表内数字不需要加引号) sort s1=[','!'] # s1.sort() # print(s1) -->['!', ' ...

  9. Python特色数据类型(列表)(上)

    Python从零开始系列连载(9)——Python特色数据类型(列表)(上) 原创 2017-10-07 王大伟 Python爱好者社区 列表 列表,可以是这样的: 分享了一波我的网易云音乐列表 今天 ...

随机推荐

  1. IsKeyboardFocused -- 键盘焦点

    <Trigger Property="IsKeyboardFocused" Value="true"> <!--<Setter Prop ...

  2. JavaScript实现模糊推荐的input框(类似百度搜索框)

    如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...

  3. Bootstrap文本排版基础--Bootsrap

    1.排版前的基础 (1)移动设备优先 <meta name="viewport" content="width=device-width, initial-scal ...

  4. iOS 简单socket连接

    - (void)CreateSocket{ NSString *host = [self.realStreamDict objectForKey:@"StreamSeverIP"] ...

  5. JAVAEE企业级应用开发浅谈第一辑

    不积跬步无以至千里,不积小流无以成江海 Step1.情景概要 作为一个JAVA WEB 开发人员,在开发web 项目时项目大家都有自己的一些新的体会,对于web 开发出现的一些比较经典的名词大家都会有 ...

  6. mac iterm2安装、sshpass密码记住

    1.  item2官网下载,自行安装 2. 导入以前生成的Prefiles文件到 /Users/alex/Library/Application Support/iTerm2/DynamicProfi ...

  7. WPF 快捷键读写txt

    因为git提交需要写这次做的,所以我想弄个东西来帮我写 WPF可以使用快捷键,快捷键主要使用InputBindings,WPF读写文件很简单 我每次都要写 第一句标题 之后就是我写的修改 然后加上我名 ...

  8. ArcGIS二次开发AO软件安装破解教程

    最近在做ArcGIS二次开发时,采用C#中的WPF技术,在调研中发现ArcGIS 10.3及以上版本支持WPF技术,但是关于ArcGIS10.3的破解教程甚少,自己尝试了不少方法都失败了,淘@宝@商家 ...

  9. Python 的装饰器

    Python 在语言级别提供了装饰器模式的实现,代码中Python内置的 functools.wraps 会完成包括函数名属性处理替换 #!/usr/bin/env python3 #--coding ...

  10. Java基础总结--Java编程环境变量配置

    1.jdk--bin--都是命令行程序(图形化是对命令行的封装)eg javac&java执行javac必须切换到其所在目录--太麻烦---想在任意目录下使用要执行一个命令--先在当前目录下找 ...