python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

时间:2022-09-01 13:56:57

版权声明:本文为博主原创文章。未经博主同意不得转载。 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:标准库:一些最爱——集合、堆和双端队列的更多相关文章

  1. python基础教程&lowbar;学习笔记14:标准库:一些最爱——re

    标准库:一些最爱 re re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持. 正則表達式的学习,见<Mastering Reg ...

  2. python基础教程&lowbar;学习笔记18:标准库:一些最爱——shelve

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36029981 标准库:一些最爱 shelve S ...

  3. python基础教程&lowbar;学习笔记12:充电时刻——模块

    充电时刻--模块 python的标准安装包含一组模块,称为标准库. 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 不论什 ...

  4. python基础教程&lowbar;学习笔记10:异常

    异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>&gt ...

  5. python基础教程&lowbar;学习笔记1:序列-1

    序列 数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素能够是数字或者字符,甚至能够是其它数据结构. python中,最主要的数据结构是序列. 序列中的每一个元素被分配一个序号--即元素的 ...

  6. python基础教程&lowbar;学习笔记9:抽象

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...

  7. python基础教程&lowbar;学习笔记11:魔法方法、属性和迭代器

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/31417309 魔法方法.属性和迭代器 在pyth ...

  8. python基础课程&lowbar;学习笔记15:标准库:有些收藏夹——fileinput

    标准库:有些收藏夹 fileinput 重要功能 性能 叙述性说明 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 ...

  9. python基础课程&lowbar;学习笔记13:标准库:有些收藏夹——sys

    标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...

随机推荐

  1. 【浅层优化实战】ssh远程登录Linux卡慢的全过程排查及解决方案

    ssh远程登录Linux卡慢的全过程排查及解决方案 前言: 在linux操作系统使用过程中偶然一次感到使用ssh远程连接软件连接操作系统需要等待许久,第一次没在意,第二次也没在意,第三次有点忍受不住了 ...

  2. MySQL-Front 建表引发的一点小思考(数据表格模版)

    我们建表的时候,有一些字段总是会常用到的.也就是每一张表都会有这些字段. 我用mysql有一点时间了,今天(2016-02-27 21:53:38)在用mysql-front建表的时候,感觉有点点不太 ...

  3. JSP 标准标签库(JSTL)之最常用的JSTL标签总结

    JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-t ...

  4. poj 1017 Packets 裸贪心

    Packets Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43189   Accepted: 14550 Descrip ...

  5. SQL Server 事务处理 回滚事务

    --创建表: GO CREATE TABLE [dbo].[tb1]( [Id] [int] NOT NULL, [c1] [nvarchar](50) NULL, [c2] [datetime] N ...

  6. libnuma&period;so&period;1&lpar;&rpar;&lpar;64bit&rpar; is needed by mysql-community-server-5&period;7&period;9-1&period;el6&period;x86&lowbar;64

    版本:5.7.9 新装的CentOS 6.3 安装MySQL 5.7.9 出现的问题 1.首先卸载系统自带的mysql 5.1的包    yum   -y  remove   mysql-libs-5 ...

  7. linux定时执行文件

     #!/bin/bashcurl "http://172.16.201.24:8080/?app_act=timer/automic_integral" -b -q -o /dev ...

  8. fstat - 读取文件相关信息

    #fstat读取到的信息 ["dev"]=> int(16777220) ["ino"]=> int(66880002) ["mode&q ...

  9. UIViewCotroller 的生命周期函数

    Viewcontroller 的所有生命周期函数 重写时 一定要先写 父类 方法 就是(super  +生命周期函数) LoadView ViewDidLoad ViewDidUnload: 在iOS ...

  10. Java经典编程题50道之十三

    一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? public class Example13 {    public static void main(St ...