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. Zeppelin源码

    1.概述 在大数据应用场景中,处理数据分析方面,由于开发者的水平不一样,使用的编程语言也不尽相同,可能会涉及到R.Python.Java.Scala等,数据计算模型也估计不一样,可能涉及的有Spark ...

  2. PHP开发要点与技巧总结(一)

    Opcache:Opcache 来源于Zend Optimizer+改名,主要作用是通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是省去了每次加载 ...

  3. CoreData归纳使用

    1.CoreData简介 2.CoreData数据模型 3.CoreData的主要对象 4.使用CoreData实现数据存储 一.CoreData简介 CoreData用做数据持久化,是数据持久化的最 ...

  4. linux 内核 zImage 生成过程分析

    1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息.符号表的最初的内核,大小约23MB: arm ...

  5. win10 & Ubuntu16 双系统安装

    忽然心血来潮吧,本机在已经安装了win10的背景下,想要再加一个linux系统学习学习,几经波折,终于成功. 博主笔记本里有两块固态,一个250G的装了win10,装的时间不久,镜像是在msdn上下载 ...

  6. C# To JAVA Converter Cracked ( 破解版 )

    C# To JAVA Converter v17.10.6  Cracked by X-Cracker 简介 C# To Java converter是一款将C#代码片段或者C#项目转换为JAVA的工 ...

  7. web项目生成war包的问题

    今天面试一家公司,问我生成war包的命令是什么? 当时没明白,就说自己用的eclipse直接右键 export --->war 完了重启tomcat(第一种) 好久没用maven了.回来一查才明 ...

  8. java:利用静态字段和构造函数实现已建对象数查询

    问题:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数. 请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?". 程序设计思想: 利用静态变量指定一个计数 ...

  9. 使用phpexcel类读写excel文件

    使用原生php读写excel文件的博文地址: 基于使用原生php读写excel文件的不靠谱,本文将简单介绍如何使用第三方类库phpexcel来读写excel文件. 首先,需要到githut下载phpe ...

  10. clone对象

    在JavaScript中,当对象作为参数传给函数的时候,在函数内部对这个对象的属性进行修改时,函数外部的对象属性也会跟着被修改,而有些时候我们并不想原来的对象数据发生改变,这时候就需要切断对象之间的引 ...