python heapq_Python成为专业人士笔记–Heapq 堆操作
“专业人士笔记”系列目录:创帆云: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 堆操作相关推荐
- python boolean_Python成为专业人士笔记-Boolean 布尔操作符研究
专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 'and' 和 'or' 并不一定返回一个布尔值 当使用o ...
- math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析
"专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com Python可以执行常见的数学运算符,包括整 ...
- python列表操作计算列表长度并输出_Python成为专业人士笔记–List列表
专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com Python列表是Python程序中广泛使用的一种通用数据 ...
- python datetime.date 和数据库date_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...
"专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 将字符串解析为对应时区的datetime对象 ...
- python按位翻转_Python成为专业人士笔记-位操作符
"专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 按位操作符直接操作二进制的字符串,这些是最基本 ...
- [转载] [转载] python 去除字符串的标点符号 用_Python成为专业人士笔记–String字符串方法
参考链接: Python字符串| 十六进制 hexdigits 参考链接: Python的字符串Strings decode "专业人士笔记"系列目录: 创帆云:Python成为专 ...
- [转载] python 去除字符串的标点符号 用_Python成为专业人士笔记–String字符串方法
参考链接: Python的字符串Strings decode "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.z ...
- python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用
"专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com python中的空白tab缩进 Python ...
- python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
"专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 有两个函数可用于获取对象的可读表示 ,常用于打 ...
最新文章
- B-tree结构菜单的递归查询
- %02 java_02-java
- python之celery简单使用
- POJ 2417 Discrete Logging 离散对数
- SSL介绍与Java实例
- git 文件全部标红_git冲突解决,代码冲突、合并冲突。【IDEA版本】
- ABAP取字符串中的连续数字
- thinkphp phpexcel导出
- 【Nutch基础教程之七】Nutch的2种运行模式:local及deploy
- 小度拆卸_拆卸invokedynamic
- asp.net mvc 前台使用后台变量
- 米家扫地机器人是石头代工_扫地机器人“两强”突进,选科沃斯还是石头科技?...
- nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
- bzoj 2302: [HAOI2011]Problem c(DP)
- python字符串encode()decode()
- 28. Location replace() 方法
- 《认知心理学》思维导图
- After 500:写500篇博客其实和写一篇是一样的
- 怎么对注册表中的垃圾文件进行清理?
- 【小程序】扫码预览时不显示图片