“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com

堆介绍

一种著名的数据结构是堆(heap),它是一种优先队列。优先队列让你能够以任意顺序添加对象,并随时(可能是在两次添加对象之间)找出(并删除)最小的元素。相比于列表方法min,这样做的效率要高得多。

实际上,Python没有独立的堆类型,而只有一个包含一些堆操作函数的模块。这个模块名为heapq(其中的q表示队列),它包含6个函数,其中前4个与堆操作直接相关。必须使用列表来表示堆对象本身。

堆类型类型中最大和最小值

要查找堆中最大的项,heapq模块有一个名为nlargest的函数,我们向它传递两个参数,第一个参数是要返回的元素个数,第二个参数是集合类型变量名

import heapq

numbers = [1, 4, 2, 100, 20, 50, 32, 200, 150, 8]

print(heapq.nlargest(4, numbers))

# 输出:[200, 150, 100, 50]

类似地,为了找到集合烦躁中最小的元素,我们使用 nsmallest函数:

import heapq

numbers = [1, 4, 2, 100, 20, 50, 32, 200, 150, 8]

print(heapq.nsmallest(4, numbers))

#输出:[1, 2, 4, 8】

对于复杂的数据结构,nlargest和 nsmallest 函数都采用一些可选的关键参数。下面的示例演示了如何使用age属性从people字典中检索最年长和最年轻的人

import heapq

people = [

{'firstname': 'John', 'lastname': 'Doe', 'age': 30},

{'firstname': 'Jane', 'lastname': 'Doe', 'age': 25},

{'firstname': 'Janie', 'lastname': 'Doe', 'age': 10},

{'firstname': 'Jane', 'lastname': 'Roe', 'age': 22},

{'firstname': 'Johnny', 'lastname': 'Doe', 'age': 12},

{'firstname': 'John', 'lastname': 'Roe', 'age': 45}

]

oldest = heapq.nlargest(2, people, key=lambda s: s['age'])

print(oldest)

# 输出: [{'firstname': 'John', 'age': 45, 'lastname': 'Roe'}, {'firstname': 'John', 'age': 30,'lastname': 'Doe'}]

#使用了key参数,利用匿名函数将key指定为每个字典元素的age属性

youngest = heapq.nsmallest(2, people, key=lambda s: s['age'])

print(youngest)

# 输出: [{'firstname': 'Janie', 'age': 10, 'lastname': 'Doe'}, {'firstname': 'Johnny', 'age': 12,'lastname': 'Doe'}]

#原理同上

最小元素弹出

堆最有趣的属性是它的最小元素始终是第一个元素:heap [0]

import heapq

numbers = [10, 4, 2, 100, 20, 50, 32, 200, 150, 8]

heapq.heapify(numbers) #将列表就地转换为堆

print(numbers)

# 输出: [2, 4, 10, 100, 8, 50, 32, 200, 150, 20] 堆的第一个元素一定是最小的那个值

heapq.heappop(numbers)

# 删除最小的值最返回:2

print(numbers)

# 输出: [4, 8, 10, 100, 20, 50, 32, 200, 150]

heapq.heappop(numbers)

# 删除最小的值最返回:4

print(numbers)

# 输出: [8, 20, 10, 100, 150, 50, 32, 200]

也许你看到每次输出堆的排列顺序非常随意,其实其并不像看起来的这样。它们虽然不是严格排序的,但必须保证一点:位置i处的元素总是大于位置i // 2处的元素(反过来说就是小于位置2 * i和2 * i + 1处的元素)。这是底层堆算法的基础,称为堆特征(heap property)。

python heapq_Python成为专业人士笔记–Heapq 堆操作相关推荐

  1. python boolean_Python成为专业人士笔记-Boolean 布尔操作符研究

    专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 'and' 和 'or' 并不一定返回一个布尔值 当使用o ...

  2. math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析

    "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com Python可以执行常见的数学运算符,包括整 ...

  3. python列表操作计算列表长度并输出_Python成为专业人士笔记–List列表

    专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com Python列表是Python程序中广泛使用的一种通用数据 ...

  4. python datetime.date 和数据库date_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...

    "专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 将字符串解析为对应时区的datetime对象 ...

  5. python按位翻转_Python成为专业人士笔记-位操作符

    "专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 按位操作符直接操作二进制的字符串,这些是最基本 ...

  6. [转载] [转载] python 去除字符串的标点符号 用_Python成为专业人士笔记–String字符串方法

    参考链接: Python字符串| 十六进制 hexdigits 参考链接: Python的字符串Strings decode "专业人士笔记"系列目录: 创帆云:Python成为专 ...

  7. [转载] python 去除字符串的标点符号 用_Python成为专业人士笔记–String字符串方法

    参考链接: Python的字符串Strings decode "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.z ...

  8. python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用

    "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com python中的空白tab缩进 Python ...

  9. python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...

    "专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 有两个函数可用于获取对象的可读表示 ,常用于打 ...

最新文章

  1. B-tree结构菜单的递归查询
  2. %02 java_02-java
  3. python之celery简单使用
  4. POJ 2417 Discrete Logging 离散对数
  5. SSL介绍与Java实例
  6. git 文件全部标红_git冲突解决,代码冲突、合并冲突。【IDEA版本】
  7. ABAP取字符串中的连续数字
  8. thinkphp phpexcel导出
  9. 【Nutch基础教程之七】Nutch的2种运行模式:local及deploy
  10. 小度拆卸_拆卸invokedynamic
  11. asp.net mvc 前台使用后台变量
  12. 米家扫地机器人是石头代工_扫地机器人“两强”突进,选科沃斯还是石头科技?...
  13. nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
  14. bzoj 2302: [HAOI2011]Problem c(DP)
  15. python字符串encode()decode()
  16. 28. Location replace() 方法
  17. 《认知心理学》思维导图
  18. After 500:写500篇博客其实和写一篇是一样的
  19. 怎么对注册表中的垃圾文件进行清理?
  20. 【小程序】扫码预览时不显示图片

热门文章

  1. 非模态对话框的销毁及消息的发送顺序
  2. 为什么Java中只有值传递
  3. PrimeNG01 angular集成PrimeNG
  4. ECharts三维图表
  5. 笑谈Android图表-MPAndroidChart
  6. 基本面(内在)-》技术面(外在)-》消息面(驱动)
  7. CUBRID学习笔记 46 PREPARED set Do
  8. ffmpeg 编译成功,Mark一下
  9. Datalist嵌套以及属性生成器和页面样式
  10. 【图精】徐克镜头里的十大美人