第八章总结

8.5. heapq — 堆队列算法

有8个算法

方法
heappush
heappop
heappushpop
heapreplace
heapify
merge
nlargest
nsmallest
  • 最小堆封装
  1. # 最小堆封装
  2. from heapq import *
  3. import pprint
  4. class MinHeap:
  5. def __init__(self, iterable):
  6. self._iteralbe = []
  7. self._max = 1000
  8. self.linearpush(iterable)
  9. # 添加
  10. def push(self, item):
  11. heappush(self._iteralbe, item)
  12. # 弹出
  13. def pop(self):
  14. res = None
  15. try:
  16. res = heappop(self._iteralbe)
  17. except Exception as e:
  18. pprint.pprint(e)
  19. return res
  20. # 一个组合动作,先添加后弹出
  21. def pushpop(self, item):
  22. res = None
  23. try:
  24. res = heappushpop(self._iteralbe, item)
  25. except Exception as e:
  26. pprint.pprint(e)
  27. return res
  28. # 一个组合动作,先弹出再添加
  29. def replace(self, item):
  30. res = None
  31. try:
  32. res = heapreplace(self._iteralbe, item)
  33. except Exception as e:
  34. pprint.pprint(e)
  35. return res
  36. # 线性将列表加入到堆中,并且将原来的列表设置成堆
  37. def linearpush(self, iterable):
  38. for it in iterable:
  39. self._iteralbe.append(it)
  40. heapify(self._iteralbe)
  41. # 将所有列表合并到堆中
  42. def mergeAll(self, *iterables):
  43. arrs = [sorted(x) for x in iterables]
  44. arrs.append(self._iteralbe)
  45. self._iteralbe = list(merge(*tuple(arrs)))
  46. # 返回n个最大值
  47. def nlagrge(self, n):
  48. if n == 1:
  49. return max(self._iteralbe)
  50. l = len(self._iteralbe)
  51. if l != 0:
  52. if l < self._max:
  53. return nlargest(n, self._iteralbe)
  54. else:
  55. return sorted(self._iteralbe, reversed=True)[:n]
  56. return None
  57. # 返回n个最小值
  58. def nsmall(self, n):
  59. if n == 1:
  60. return self.getMin()
  61. l = len(self._iteralbe)
  62. if l != 0:
  63. if l < self._max:
  64. return nsmallest(n, self._iteralbe)
  65. else:
  66. return sorted(self._iteralbe)[:n]
  67. return None
  68. # 返回最小值
  69. def getMin(self):
  70. if len(self._iteralbe) == 0:
  71. return None
  72. else:
  73. return self._iteralbe[0]
  74. a = [10, 2, 9, 4, 3, 5, 8, 6, 7, 1]
  75. heap = MinHeap(a)
  76. print("最小值是 {0}".format(heap.getMin()))
  77. print("先添加后弹出是 {0}".format(heap.pushpop(0)))
  78. print("先弹出后添加是 {0}".format(heap.replace(0)))
  79. print("最小值是 {0}".format(heap.pop()))
  80. print("前20个最大值是 {0}".format(heap.nlagrge(20)))
  81. print("前2个最小值是 {0}".format(heap.nsmall(2)))
  82. heap.mergeAll([8, 2, 4], [9, 10, -1])
  83. print("合并之后的最小值是 {0}".format(heap.getMin()))

执行后的效果如下:

  • 实现优先队列
  1. # 优先队列封装
  2. import itertools
  3. class priority_deque:
  4. def __init__(self):
  5. self.deque = []
  6. self.entry_findeer = {}
  7. self.conter = itertools.count() # 用来处理优先级相同的任务
  8. def add_task(self, task, priority= 0):
  9. if task in self.entry_findeer:
  10. self.remove_task(task)
  11. count = next(self.conter)
  12. entry = [priority, count, task]
  13. self.entry_findeer[task] = entry
  14. heappush(self.deque, entry)
  15. def remove_task(self, task):
  16. if task in self.entry_findeer:
  17. self.entry_findeer.pop(task)
  18. def pop_task(self):
  19. while self.deque:
  20. return heappop(self.deque)
  21. deque = priority_deque()
  22. deque.add_task("第一个任务")
  23. deque.add_task("第二个任务")
  24. print(deque.pop_task())
  25. print(deque.pop_task())

8.6.bisect — 数组分割算法

有6个函数

函数
biset_left
biset_right/biset
insort_left
insort_right/insort

实现

  1. import bisect
  2. def index(a, x):
  3. 'Locate the leftmost value exactly equal to x'
  4. i = bisect.bisect_left(a, x)
  5. if i != len(a) and a[i] == x:
  6. return i
  7. raise ValueError
  8. def find_lt(a, x):
  9. 'Find rightmost value less than x'
  10. i = bisect.bisect_left(a, x)
  11. if i:
  12. return a[i-1]
  13. raise ValueError
  14. def find_le(a, x):
  15. 'Find rightmost value less than or equal to x'
  16. i = bisect.bisect_right(a, x)
  17. if i:
  18. return a[i-1]
  19. raise ValueError
  20. def find_gt(a, x):
  21. 'Find leftmost value greater than x'
  22. i = bisect.bisect_right(a, x)
  23. if i != len(a):
  24. return a[i]
  25. raise ValueError
  26. def find_ge(a, x):
  27. 'Find leftmost item greater than or equal to x'
  28. i = bisect.bisect_left(a, x)
  29. if i != len(a):
  30. return a[i]
  31. 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 - 内建类型的动态类型创建和名称

动态创建新类型

  1. import types
  2. # Methods
  3. def __init__(self, name, shares, price):
  4. self.name = name
  5. self.shares = shares
  6. self.price = price
  7. def cost(self):
  8. return self.shares * self.price
  9. cls_dict = {
  10. '__init__' : __init__,
  11. 'cost' : cost,
  12. }
  13. Stock = types.new_class('Stock', (), {}, lambda ns: ns.update(cls_dict))
  14. Stock.__module__ = __name__
  15. s = Stock('ACME', 50, 91.1)
  16. 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. 使用Blender的UV映射制作一个地球

    UV映射是一个用来2D图片纹理转换3D网格的标准技术.U和V表示平面坐标的两个轴,对应了3D空间中X.Y和Z.Blender手册是这样解释UV映射的:想象一个3D模型对象,例如一个球体,平铺到桌面上. ...

  2. duboo解析的入口

    使用duboo只需要在spring配置文件做如下配置就好: < dubbo:provider timeout= "${default.dubbo.provider.timeout}&q ...

  3. PXC5.7集群部署

    PXC三节点安装: node1:10.157.26.132 node2:10.157.26.133 node3:10.157.26.134   配置服务器ssh登录无密码验证 ssh-keygen实现 ...

  4. #使用parser获取图片信息,输出Python官网发布的会议时间、名称和地点。

    # !/usr/bin/env/Python3 # - * - coding: utf-8 - * - from html.parser import HTMLParser import urllib ...

  5. bootstrap 获得轮播中的索引或当前活动的焦点对象

    今天用bootstrap做一个轮播,当轮播滚到每张图的时候,在页面下面就显示相对应的内容,那么问题来了:为了轮播图的可扩展性,我们肯定需要知道当前活动(显示图片)的索引号,查了bootstrap文档, ...

  6. redis性能优化

    redis日志截图:

  7. BM25和Lucene Default Similarity比较 (原文标题:BM25 vs Lucene Default Similarity)

    原文链接: https://www.elastic.co/blog/found-bm-vs-lucene-default-similarity 原文 By Konrad Beiske 翻译 By 高家 ...

  8. Java中线程的实现:

    Java中线程的实现: 一.线程简介: 实现的两种方式为: 1.Thread类 2.Runnable接口 都在java.lang中 都有共通的方法:public void run() 二.线程常用方法 ...

  9. python selenium 元素定位(三)

    上两篇的博文中介绍了python selenium的环境搭建和编写的第一个自动化测试脚本,从第二篇的例子中看出来再做UI级别的自动化测试的时候,有一个至关重要的因素,那就是元素的定位,只有从页面上找到 ...

  10. Jenkins获取git tags代码

    配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...