第八章总结

8.5. heapq — 堆队列算法

有8个算法

方法
heappush
heappop
heappushpop
heapreplace
heapify
merge
nlargest
nsmallest
  • 最小堆封装
# 最小堆封装
from heapq import *
import pprint
class MinHeap:
def __init__(self, iterable):
self._iteralbe = []
self._max = 1000
self.linearpush(iterable)
# 添加
def push(self, item):
heappush(self._iteralbe, item)
# 弹出
def pop(self):
res = None
try:
res = heappop(self._iteralbe)
except Exception as e:
pprint.pprint(e)
return res
# 一个组合动作,先添加后弹出
def pushpop(self, item):
res = None
try:
res = heappushpop(self._iteralbe, item)
except Exception as e:
pprint.pprint(e)
return res
# 一个组合动作,先弹出再添加
def replace(self, item):
res = None
try:
res = heapreplace(self._iteralbe, item)
except Exception as e:
pprint.pprint(e)
return res
# 线性将列表加入到堆中,并且将原来的列表设置成堆
def linearpush(self, iterable):
for it in iterable:
self._iteralbe.append(it)
heapify(self._iteralbe)
# 将所有列表合并到堆中
def mergeAll(self, *iterables):
arrs = [sorted(x) for x in iterables]
arrs.append(self._iteralbe)
self._iteralbe = list(merge(*tuple(arrs)))
# 返回n个最大值
def nlagrge(self, n):
if n == 1:
return max(self._iteralbe)
l = len(self._iteralbe)
if l != 0:
if l < self._max:
return nlargest(n, self._iteralbe)
else:
return sorted(self._iteralbe, reversed=True)[:n]
return None
# 返回n个最小值
def nsmall(self, n):
if n == 1:
return self.getMin()
l = len(self._iteralbe)
if l != 0:
if l < self._max:
return nsmallest(n, self._iteralbe)
else:
return sorted(self._iteralbe)[:n]
return None
# 返回最小值
def getMin(self):
if len(self._iteralbe) == 0:
return None
else:
return self._iteralbe[0]
a = [10, 2, 9, 4, 3, 5, 8, 6, 7, 1]
heap = MinHeap(a)
print("最小值是 {0}".format(heap.getMin()))
print("先添加后弹出是 {0}".format(heap.pushpop(0)))
print("先弹出后添加是 {0}".format(heap.replace(0)))
print("最小值是 {0}".format(heap.pop()))
print("前20个最大值是 {0}".format(heap.nlagrge(20)))
print("前2个最小值是 {0}".format(heap.nsmall(2)))
heap.mergeAll([8, 2, 4], [9, 10, -1])
print("合并之后的最小值是 {0}".format(heap.getMin()))

执行后的效果如下:

  • 实现优先队列
# 优先队列封装
import itertools
class priority_deque:
def __init__(self):
self.deque = []
self.entry_findeer = {}
self.conter = itertools.count() # 用来处理优先级相同的任务
def add_task(self, task, priority= 0):
if task in self.entry_findeer:
self.remove_task(task)
count = next(self.conter)
entry = [priority, count, task]
self.entry_findeer[task] = entry
heappush(self.deque, entry)
def remove_task(self, task):
if task in self.entry_findeer:
self.entry_findeer.pop(task)
def pop_task(self):
while self.deque:
return heappop(self.deque)
deque = priority_deque()
deque.add_task("第一个任务")
deque.add_task("第二个任务")
print(deque.pop_task())
print(deque.pop_task())

8.6.bisect — 数组分割算法

有6个函数

函数
biset_left
biset_right/biset
insort_left
insort_right/insort

实现

import bisect
def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bisect.bisect_left(a, x)
if i != len(a) and a[i] == x:
return i
raise ValueError
def find_lt(a, x):
'Find rightmost value less than x'
i = bisect.bisect_left(a, x)
if i:
return a[i-1]
raise ValueError
def find_le(a, x):
'Find rightmost value less than or equal to x'
i = bisect.bisect_right(a, x)
if i:
return a[i-1]
raise ValueError
def find_gt(a, x):
'Find leftmost value greater than x'
i = bisect.bisect_right(a, x)
if i != len(a):
return a[i]
raise ValueError
def find_ge(a, x):
'Find leftmost item greater than or equal to x'
i = bisect.bisect_left(a, x)
if i != len(a):
return a[i]
raise ValueError

8.7. array - 高效的数值数组

参见列表

常用的函数包括:

函数 描述
array
itemsize
append
count
extend(iterable)
index(x)
insert(i, x)
pop([i])
remove(x)
reverse()
tolist()
tobytes()
tounicode()

8.8. weakref - 弱参考

弱引用的主要用途是实现持有大对象的高速缓存或映射,其中希望大对象不会因为它出现在高速缓存或映射中而保持活着。

8.9. types - 内建类型的动态类型创建和名称

动态创建新类型

import types
# Methods
def __init__(self, name, shares, price):
self.name = name
self.shares = shares
self.price = price
def cost(self):
return self.shares * self.price
cls_dict = {
'__init__' : __init__,
'cost' : cost,
}
Stock = types.new_class('Stock', (), {}, lambda ns: ns.update(cls_dict))
Stock.__module__ = __name__
s = Stock('ACME', 50, 91.1)
print(s.cost())

注意

__module__属性代表着是从哪个模块导入进行来的,向上面那样设置以后,Stock.__module__就变成__main__

参考文章

8.10. copy - 浅和深复制操作

  • copy:浅拷贝
  • deepcopy:深拷贝
  • copy.error:引发模块特定错误。

注意两者的区别,区别在于所拷贝对象里面是否还有比较复杂的数据结构,否则两者是一样。

8.11. pprint - 数据漂亮打印机

pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)

如果 stream 为 None,使用 sys.stdout,indent为缩进,width为宽度,depth为深度。

Python 第八章笔记的更多相关文章

  1. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  2. 《简明python教程》笔记一

    读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info  安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...

  3. python 正则使用笔记

    python正则使用笔记 def remove_br(content): """去除两边换行符""" content = content.r ...

  4. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  5. python 库安装笔记

    python 库安装笔记 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-2-22 友情提示 安装python库的过程中 ...

  6. Python Click 学习笔记(转)

    原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...

  7. Python源代码剖析笔记3-Python运行原理初探

    Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...

  8. C#语言和SQL Server第八章笔记

    一:                                                                                                   ...

  9. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

随机推荐

  1. MySQL事件调度器event的使用

    Q:假设,有一个需求,希望在某一个时刻系统调用一个begin end执行一下:十分钟以后执行一下begin end.亦或有一个需求,每个多长时间周期性执行begin end.那么这个时候该怎么办呢? ...

  2. 学习笔记:javascript内置对象:字符串对象

    1.字符串的创建   var str = "Hello Microsoft!";   2.字符串属性   constructor  返回创建字符串属性的函数   length    ...

  3. Mac OS 安装 Git 环境

    1. 在mac的终端上,输入git会提示安装git软件,确认安装.安装完成后打开终端,使用git --version或者which git命令查看安装版本,有就是安装成功了. 2. 创建一个全局用户名 ...

  4. struts2.1.6教程四_2、ActionContext 、ValueStack 、Stack Context

    ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext.getContext() Va ...

  5. Grid search in the tidyverse

    @drsimonj here to share a tidyverse method of grid search for optimizing a model's hyperparameters. ...

  6. HTML中部分标签的嵌套问题

    书写HTML结构的时候,对于标签的嵌套问题,在我发现这个问题之前,都不在自己的考虑之中,还傻傻的以为标签之间是可以进行百搭的! 其实,有些标签是不能进行随意嵌套,如果你没有深受其害,你是不会发现它的存 ...

  7. DedeCMS数据负载性能优化方案简单几招让你提速N倍

    前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...

  8. CTF 和 PHP ,数据库

    引言 接触CTF 差不多一个月了,网上题目刷得也差不多,做了不少笔记,老想总结一下.当然,这种文章网上多得是. 正文笔记 少不了弱类型,松散比较,放一张图 2.  mysql_real_escape_ ...

  9. 关于STM32空闲中断

    有一次做一个东西,为了尽量不占用CPU的处理数据时间,所以就使用DMA接收串口的数据,但是呢问题来了.,,,,,怎么样才能确定接收到了一条完整的数据了,,我们都知道只要打开DMA 那家伙就不停的把接收 ...

  10. LAMP的搭建与简易配置(apache,php已module方式结合)

    测试所用环境:centos7.2 apache php 所在主机IP:9.110.187.120 mariadb 所在主机IP:9.110.187.121 第一部分:环境搭建 yum安装软件包 其中a ...