python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/signjing/article/details/36201499
标准库:一些最爱
集合、堆和双端队列
集合
集合Set类位于sets模块中。
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(range(10))
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
集合是由序列(或其它可迭代的对象)构建的。主要用于检查成员资格。因此,副本是被忽略的:
>>> range(10)*2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(range(10)*2)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
和字典一样,集合元素的顺序是随意的,因此不应该以元素的顺序作为根据进行编程:
>>> set(['b','a','c'])
set(['a', 'c', 'b'])
除了检查成员资格外,还能够使用标准的集合操作。如求并集和交集,能够用法,也能够对整数进行位操作时使用的操作。
如想找出两个集合的并集。能够使用其中一个集合的union方法或者使用按位与(OR)运算符”|”:
>>> a=set(range(5))
>>> a
set([0, 1, 2, 3, 4])
>>> b=set(range(1,8,2))
>>> b
set([1, 3, 5, 7])
>>> a.union(b)
set([0, 1, 2, 3, 4, 5, 7])
>>> a|b
set([0, 1, 2, 3, 4, 5, 7])
其它方法和运算符
交集
>>> c=a&b
>>> c
set([1, 3])
>>> c.issubset(a)
True
>>> c.issubset(b)
True
>>> c<=a
True
>>> c>=a
False
>>> c<=b
True
>>> c>=b
False
>>> a.intersection(b)
set([1, 3])
>>> a&b
set([1, 3])
差
>>> a.difference(b)
set([0, 2, 4])
>>> a-b
set([0, 2, 4])
>>> b-a
set([5, 7])
>>> b.difference(a)
set([5, 7])
对称差
>>> a.symmetric_difference(b)
set([0, 2, 4, 5, 7])
>>> a^b
set([0, 2, 4, 5, 7])
拷贝
>>> a.copy()
set([0, 1, 2, 3, 4])
>>> a.copy() is a
False
还有些原地运算符和相应的方法,以及基本方法add和remove。
集合是可变的,所以不能用做字典中的键。
另外一个问题是集合本身仅仅能包括不可变(可散列的)值,所以也就不能包括其它集合。
实际其中。集合的集合是非经常常使用的。所以这就是个问题:
幸好有个frozenset类型,用于代表不可变(可散列)的集合:
>>> a=set()
>>> b=set()
>>> a.add(b)
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
a.add(b)
TypeError: unhashable type: 'set'
>>> a.add(frozenset(b))
Frozenset构造函数创建给定集合的副本,无论是集合作为其它集合还是字典的键,frozenset都非常实用。
堆
堆(heap)是优先队列的一种。使用优先队列能够以随意顺序添加对象,而且能在不论什么时间(可能在添加对象的同一时候)找到(也可能是移除)最小的元素,也就是说比用于列表的min方法要有效率得多。
其实,python并没有独立的堆类型——仅仅有一个包括一些堆操作函数的模块,这个模块叫做heapq(q是queue的缩写)。
Heapq模块中重要的函数
|
函数 |
描写叙述 |
|
heappush(heap,x) |
将x入堆 |
|
heappop(heap,x) |
将堆中最小的元素弹出 |
|
heapify(heap) |
将heap属性强制应用到随意一个列表 |
|
heapreplace(heap,x) |
将堆中最小的元素弹出,同一时候将x入堆 |
|
nlargest(n,iter) |
返回iter中第n大的元素 |
|
nsmallest(n,iter) |
返回iter中第n小的元素 |
heappush函数用于添加堆的项。注意,不能将它用于不论什么之前讲述的列表中——它仅仅能用于通过各种堆函数创建的列表中。
原因是元素的顺序非常重要。
>>> from heapq import *
>>> from random import shuffle
>>> data=range(10)
>>> shuffle(data)
>>> heap=[]
>>> for n in data:
heappush(heap,n)
>>> heap
[0, 1, 5, 3, 2, 6, 7, 9, 8, 4]
>>> heappush(heap,0.5)
>>> heap
[0, 0.5, 5, 3, 1, 6, 7, 9, 8, 4, 2]
元素的顺序并不像看起来那么随意。虽然不是严格排序的,但也是有规则的:位于i位置上的元素总比i/2位置处的元素大(反过来说就是i位置处的元素总比2*i以及2*i+1位置处的元素小)。这是底层堆算法的基础,而这个特性称为堆属性。
heappop函数弹出最小的元素——一般来说都是在索引0处的元素,而且会确保剩余元素中最小的那个占领这个位置(保持刚才提到的堆属性)。
一般来说。虽然弹出列表的第一个元素并非非常有效率,但在这里不是问题。由于heappop在“幕后”会做一些静止的移位操作:
>>> heappop(heap)
0
>>> heappop(heap)
0.5
>>> heappop(heap)
1
>>> heap
[2, 3, 5, 8, 4, 6, 7, 9]
heapify函数使随意列表作为參数。并通过尽可能少的移位操作,将其转换为合法的堆。假设没实用heappush建立堆,那么在使用heappush和heappop前应该使用这个函数。
>>> heap=[5,8,0,3,6,7,9,1,4,2]
>>> heap
[5, 8, 0, 3, 6, 7, 9, 1, 4, 2]
>>> heapify(heap)
>>> heap
[0, 1, 5, 3, 2, 7, 9, 8, 4, 6]
heapreplace函数并不像其它函数那么经常使用。它弹出堆的最小元素。而且将新元素推入,这样做比调用heappop之后再调用heappush更高效。
>>> heapreplace(heap,0.5)
0
>>> heap
[0.5, 1, 5, 3, 2, 7, 9, 8, 4, 6]
>>> heapreplace(heap,10)
0.5
>>> heap
[1, 2, 5, 3, 6, 7, 9, 8, 4, 10]
heapq模块中剩下的两个函数nlargest(n,iter)和nsmallest(n,iter)分别用来寻找不论什么可迭代对象iter中第n大或第n小的元素。能够使用排序和分片来完毕这个工作。但堆算法更快而且更有效地使用内存。也更易用。
双端队列
双端队列(Double-ended queue,或称deque)在须要依照元素添加的顺序来移除元素时非常实用。
双端队列通过可迭代对象(比方集合)创建,而且有些非常实用的方法。
>>> from collections import deque
>>> q=deque(range(5))
>>> q.append(5)
>>> q.appendleft(6)
>>> q
deque([6, 0, 1, 2, 3, 4, 5])
>>> q.pop()
5
>>> q.popleft()
6
>>> q
deque([0, 1, 2, 3, 4])
>>> q.rotate(-1)
>>> q
deque([1, 2, 3, 4, 0])
>>> q.rotate(3)
>>> q
deque([3, 4, 0, 1, 2])
双端队列好用的原因是它能够有效地在开头(左側)添加和弹出元素,这是列表中无法实现的。
除此之外。使用双端队列的优点还有:能够有效地旋转(rotate)元素(也就是将它们左移或右移,使头尾相连)。双端队列对象还有extend和extendleft方法。extend和列表的extend方法几乎相同。extendleft则相似于appendleft。注意,extendleft使用的可迭代对象中的元素会反序出如今双端队列中。
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列的更多相关文章
- python基础教程_学习笔记14:标准库:一些最爱——re
标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...
- python基础教程_学习笔记18:标准库:一些最爱——shelve
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36029981 标准库:一些最爱 shelve S ...
- python基础教程_学习笔记12:充电时刻——模块
充电时刻--模块 python的标准安装包含一组模块,称为标准库. 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 不论什 ...
- python基础教程_学习笔记10:异常
异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...
- python基础教程_学习笔记1:序列-1
序列 数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素能够是数字或者字符,甚至能够是其它数据结构. python中,最主要的数据结构是序列. 序列中的每一个元素被分配一个序号--即元素的 ...
- python基础教程_学习笔记9:抽象
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...
- python基础教程_学习笔记11:魔法方法、属性和迭代器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/31417309 魔法方法.属性和迭代器 在pyth ...
- python基础课程_学习笔记15:标准库:有些收藏夹——fileinput
标准库:有些收藏夹 fileinput 重要功能 性能 叙述性说明 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 ...
- python基础课程_学习笔记13:标准库:有些收藏夹——sys
标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...
随机推荐
- perl基础01
参考:Perl教程 1.Perl简介 Perl是Practical Extraction and Report Language的缩写,它是由Larry Wall设计的. Perl具有高级语言的强大能 ...
- [转]RPC、CORBA、WebService之区别
RPC是由Sun发明的远程过程调用协议,是第一种真正的分布式应用模型.Windows上使用的R PC是DCERPC的扩展.严格地说,RPC是一种逻辑上的协议,它可以使用Socket.Named Pip ...
- linux split
说来惭愧,用了这么久linux会的命令也只有常用的那么几个.. 今天刚刚学到的一个很实用的split命令,原本就只是知道开发语言中有split方法用来切分字符串,linux命令行也提供了这样一个方法. ...
- XML简单学习
XML简单概述 1.Extensible Markup language可扩展标记语言; 2.作用:具有层次性的描述有关系的数据: 体现在:描述数据关系:软件配置,以描述程序模块之间的关系: 语法介绍 ...
- Android开发人员必须掌握的10 个开发工具+应该深入学习的10个开源应用项目
一.Android开发人员必须掌握的10 个开发工具 Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. ...
- 【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)
http://new.tyvj.cn/p/2065 我就不说我很sb的用线段树来维护值...... 本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法.最后一小时才想出来线段树(果 ...
- 转载:Faster-RCNN详解
原文:http://blog.csdn.net/zy1034092330/article/details/62044941 原文大神有很多经典之作,并且讲解得很透彻,建议前往,这里仅当学习使用. Fa ...
- layoutSubviews何时调用的问题
本文转载至 http://www.cnblogs.com/pengyingh/articles/2417211.html 今天跟旺才兄学习了一下UIView的setNeedsDisplay和setNe ...
- 怎么查看mac系统是32位还是64位的操作系统
如何查看mac系统是32位还是64位的操作系统 (一)点击工具栏左上角点击 (苹果Logo)标志,关于本机 --> 更多信息 --> 系统报告 -->(左侧栏中)软件 (二) ...
- simpson公式求定积分(模板)
#include<cstdio> #include<cmath> #include <algorithm> using namespace std; double ...