#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]) 先进先出
双端队列:
array对象typecode:
array属性方法:
#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=' , ')