Python基础(11)deque , heapq , array ,bisect

#coding=gbk
#数据结构
#deque对象,双端队列,collection.deque,支持从任何一段删除和增加元素,deque是线程安全的,内存高效的队列

#deque 作为栈,栈是先进后出的,使用append,pop即可
from collections import *

dp=deque()
dp.append(1)
dp.append(2)
dp.append(3)
print(dp)# 输出  deque([1, 2, 3])
dp.pop()
dp.pop()
print(dp)   #输出为 :deque([1])

#deque 对象作为队列,队列是先进先出的,类似于排队
from collections import *
dp=deque()
dp.append(1)
dp.append(2)
dp.append(3)
print(dp)# 输出  deque([1, 2, 3])
dp.popleft()
print(dp)   #输出为:deque([2, 3]) 先进先出

双端队列:

Python基础(11)deque , heapq , array ,bisect_第1张图片

array对象typecode:

Python基础(11)deque , heapq , array ,bisect_第2张图片

array属性方法:

Python基础(11)deque , heapq , array ,bisect_第3张图片

Python基础(11)deque , heapq , array ,bisect_第4张图片

#array对象是包含相同基本数据类型的列表
#显然,array对象时可变的对象
import array
arr1=array.array('b',(1,2,3,4,5))
print(arr1[1])
del arr1[1]
print(arr1)
print(arr1[2:])
arr1.append(22)
print(arr1)

堆的定义:堆是一种特殊的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构指的是二叉树。堆的特点是根节点的值最大(或者最小),而且根节点的两个孩子也能与孩子节点组成子树,亦然称之为堆。 堆分为两种,大根堆和小根堆是一颗每一个节点的键值都不小于(大于)其孩子节点的键值的树。无论是大根堆还是小根堆(前提是二叉堆)都可以看成是一颗完全二叉树。下面以图的形式直观感受一下: 这里写图片描述
heapq模块在Python中也对堆这种数据结构进行了模块化,我们可以通过调用heapq模块来建立堆这种数据结构,同时heapq模块也提供了相应的方法来对堆做操作。
heap = [ ] #创建了一个空堆 
heappush(heap,item) #往堆中插入一条新的值 
item = heappop(heap) #从堆中弹出最小值 
item = heap[0] #查看堆中最小值,不弹出 
heapify(x) #以线性时间将一个列表转化为堆 

#堆 heapq
from heapq import *
heap=[]
heappush(heap,1)
heappush(heap,5)
heappush(heap,3)
print(heappop(heap)) #弹出最小的值

#基于堆的排序
from heapq import *
def heapsorted(iterable):
    h=[]
    for value in iterable:
        heappush(h,value)   #将value值,入堆
    return [heappop(h) for i in range(len(h))]  # heappop(h),将h中的元素最小值弹出堆,数据逐一弹出
data=[1,2,5,3,9,5,0,2]
print(heapsorted(data)) #输出[0, 1, 2, 2, 3, 5, 5, 9]
#heapq.heappushpop(heap,item),先将item推入堆中并弹出最小值

import heapq
for i in heapq.merge([1,2,5,7],[6,8,90]):   #merge中的列表需要使排列顺序从小到大
    print(i,end=' ')
#或者
print(' ----------')
import heapq
list1=[2,4,10]
list2=[9,6,4,0,1]
heapq.heapify(list1)
heapq.heapify(list2)
print(list1)
print(list2)
for i in heapq.merge(list1,list2):
    print(i,end=" ")
print(' --------')

h=heapq.nlargest(2,[4,59,8,10,34])  #获取n个最大的值[59, 34]
print(h)
h1=heapq.nsmallest(2,[4,59,8,10,34])#[4, 8]
print(h1)

#bisect 模块提供了基于二分法算法的函数
import bisect
list3=[1,3,5,7,9]
x=bisect.bisect(list3,2) #查找有序表list3 中2 的索引值
print(x)    #输出为 1

list4=[1,3,5,7,9]
bisect.insort(list4,2)  #在有序列表list4中插入 2 ,并保持其有序性
print(list4)    #输出的为 [1, 2, 3, 5, 7, 9]
#使用bisect模块实现成绩等级分类
import bisect
def grade(score,breakpoints=[60,70,80,90],grades='FDCBA'):  #grades 分配成绩的等级
    i=bisect.bisect(breakpoints,score)  #区分出score 在breakpoints中的索引值
    return grades[i]      #得到得分等级  
data=[33,67,78,89,99]
for i in data:
    print(i,grade(i),end=' , ')


你可能感兴趣的:(Python)