代码编织梦想

Python【C++常用STL相关内容】

最近呢在备战蓝桥杯,但是刷题的过程中,发现之前一直用C++的STL,现在有些功能不太熟悉,并且Python的时间效率实在是太低了,所以整理一下C++中的STL在Python中对应的知识点。

1.栈(LifoQueue)

import queue
# Python的LifoQueue相当于C++STL的stack
# 后入队者先出队,入参 maxsize 是一个整数,用于设置队列的最大长度。
# 一旦队列达到上限,插入数据将会被阻塞,直到有数据出队列之后才可以继续插入。
# 如果 maxsize 设置为小于或等于零,则队列的长度没有限制。

# 创建LifoQueue
sta = queue.LifoQueue()
# 使用put()可以往栈中压入元素
sta.put(1)
sta.put(3)
sta.put(2)
# 使用empty()可以判断栈是否为空
# 使用get()可以弹出并且返回栈顶元素
while not sta.empty():
    print(sta.get())

输出:

2
3
1

2.队列(Queue)

import queue
# Python的Queue相当于C++STL的queue
# 先进先出队列,入参 maxsize 是一个整数,用于设置队列的最大长度。
# 一旦队列达到上限,插入数据将会被阻塞,直到有数据出队列之后才可以继续插入。
# 如果 maxsize 设置为小于或等于零,则队列的长度没有限制。

# 定义了一个Queue
q = queue.Queue()
# 使用put可以将元素入队
q.put(1)
q.put(3)
q.put(2)
# 使用qsize()可以查看队列的元素个数
print(q.qsize())
# 使用empty()可以查看队列是否为空
# 使用get()可以弹出并且返回队列的队头元素
while not q.empty():
    print(q.get())

输出:

3
1
3
2

3.字典(dict)

# 使用dict()可以创建一个新的字典
d = dict()
# 使用d[x]=y可以添加一个键值对x:y
# 如果x已经存在那么就将该x对应的值修改为y
# 该操作的时间复杂度为O(1)
d[1] = "hello"
d[2] = "python"
d[2]= "Python"
print(d)
# 使用del d[x]可以将键为x的对从字典d中删除
# 如果字典中不存在该键,那么会报错
# 该操作的时间复杂度为O(1)
del d[1]
print(d)
# 使用len(d)可以查看字典中键值对的个数
print(len(d))
# 使用x in d可以判断键x是否在d中存在
# 时间复杂度为O(1)
if 2 in d:
    del d[2]
print(d)
# 此外还可以对字典进行遍历或者复制操作
# 时间复杂度为O(n)
# 使用clear可以清空字典
# 使用del d可以删除字典d

输出:

{1: 'hello', 2: 'Python'}
{2: 'Python'}
1
{}

4.集合(set)

# 使用set()可以创建一个空的集合
s = set()

# 使用add()可以往集合中添加元素
# 其时间复杂度平均为O(1),最坏的情况是O(n)
s.add(1)
s.add(1)
s.add(1)
s.add(2)
s.add(2)
s.add(3)
s.add(4)
print(s)

# 使用 x in s可以判断值x是否在集合s中
# 其时间复杂度平均为O(1),最坏的情况是O(n)
# 使用remove(x)可以将值x从集合中删除
# 其时间复杂度平均为O(1),最坏的情况为O(n)
if 1 in s:
    s.remove(1)
print(s)

# 集合的运算
t = set([1,2,3])
print(t)
# 使用s - t可以得到两个集合的差
# 其时间复杂度为O(len(s))
print(s - t)
# 使用s & t可以得到两个集合的交集
# 其时间复杂度为O(min(len(s),len(t)))
print(s & t)
# 使用s | t可以得到两个集合的并集
print(s | t)
# 使用s ^ t可以得到不同时在两个集合的元素
print(s ^ t)
print('---------------------')

# 如果要添加的元素布不止一个,那么可以用update方法将列表、元组、字典添加到集合中
ss = set()
ss.add(1)
print(ss)
ss.update([1,2,3,4])
print(ss)
# 如果要删除的内容不在集合中,用remove会出现报错
# 这时候可以使用discard来删除
ss.remove(1)
ss.discard(1)
print(ss)
# 使用len可以查看集合中元素的个数
print(len(ss))
# 拷贝集合可以用copy
sss = ss.copy()
print(sss)
# 使用clear可以清空集合
ss.clear()
print(ss)
print(sss)

输出:

{1, 2, 3, 4}
{2, 3, 4}
{1, 2, 3}
{4}
{2, 3}
{1, 2, 3, 4}
{1, 4}
---------------------
{1}
{1, 2, 3, 4}
{2, 3, 4}
3
{2, 3, 4}
set()
{2, 3, 4}

5.堆(heapq)

import heapq        # 引入

# 堆的特性是最小的元素在根节点 heap[0]访问

# 创建一个堆,可以用[]
q1 = []
q2 = [5,3,2,4,1]
# 或者用heapify把一个list转换成堆,原地,线性时间内
heapq.heapify(q2)

# heapq.heappush(a,b) 将b加入到堆a中
# 将某个值加入heap中
heapq.heappush(q1,3)    # 往q1中加入3
heapq.heappush(q2,3)    # 往q2中加入3
heapq.heappush(q1,4)    # 往q1中加入4
heapq.heappush(q2,4)    # 往q2中加入4
heapq.heappush(q1,0)    # 往q1中加入0
heapq.heappush(q2,0)    # 往q2中加入0

# heapq.heappop(a) 弹出并返回堆a中最小的元素
# 打印堆两种方式
while q1:
    print(q1[0],end=' ')
    heapq.heappop(q1)
print()
while q2:
    print(heapq.heappop(q2),end=' ')
print()

# heapq.heappushpop(a,b) 将b放入堆a中,再弹出并返回a中最小的元素
# 该方法比先heappush(b) 再heappop(a)运行起来更有效率
heapq.heappush(q1,2)
heapq.heappush(q1,5)
heapq.heappush(q1,6)
heapq.heappushpop(q1,4)
print(q1)       # 直接print堆输出的不是按从小到大的顺序输出的,而是按这个列表的内容输出的

# heapq.nlargest(n,q,key=None) 返回堆q中前n个最大值,key指定单参数
# heapq.nsmallest(n,q,key=Node) 返回堆q中前n个最小值,key指定单参数
print(heapq.nlargest(2,q1))
print(heapq.nsmallest(2,q1))

输出:

0 3 4 
0 1 2 3 3 4 4 5 
[4, 5, 6]
[6, 5]
[4, 5]

6.优先队列(PriorityQueue)

import queue
# Python的PriorityQueue相当于C++STL的priority_queue
# 后入队者先出队,入参 maxsize 是一个整数,用于设置队列的最大长度。
# 一旦队列达到上限,插入数据将会被阻塞,直到有数据出队列之后才可以继续插入。
# 如果 maxsize 设置为小于或等于零,则队列的长度没有限制。

# 创建PriorityQueue
pq = queue.PriorityQueue()
# 使用put()可以往优先队列中压入元素
pq.put(1)
pq.put(3)
pq.put(2)
# 使用empty()可以判断栈是否为空
# 使用get()可以弹出并且返回栈顶元素
while not pq.empty():
    print(pq.get())

pq2 = queue.PriorityQueue()
pq2.put([1,10,100])
pq2.put([3,100,0])
pq2.put([4,-10,-10])
while not pq2.empty():
    print(pq2.get())

输出:

1
2
3
[1, 10, 100]
[3, 100, 0]
[4, -10, -10]

7.二分查找(bisect)

import bisect       # import二分库

arr = [1,4,5,3,2,4,5,6,2,3,8]
arr.sort()
print(arr)
# bisect.bisect(a,x,lo = 0,hi = len(a))
# a是需要查找的数组,x是需要查找的值,lo是区间开始位置,hi是区间结束位置的后一个位置
# 默认查找的区间是整个a,返回值是x能插入到arr的合适位置(需要保证插入后arr增减不变)
print(bisect.bisect(arr,7))
# 如果arr中存在了一个或者多个x了,返回的是所以等于x的值的最右边的下一位
print(bisect.bisect(arr,1))
print(bisect.bisect(arr,2))
# 如果需要看最左边是在哪个地方,那就使用bisect.bisect_left(arr,x)
# 同样也有bisect.bisect_right(arr,x)效果和bisect.bisect(arr,x)一样
print(bisect.bisect_left(arr,1))
print(bisect.bisect_left(arr,2))
# 如果我们需要查找一个数在有序列表中最早出现的位置,那么就直接使用bisect.bisect_left()
# 如果我们需要查找一个数在有序列表中最后出现的位置,那么就直接使用bisect.bisect_right()
# 如果我们要查找的数可能不在该有序列表中,那么就对查找的下标进行判断是否等于要查询的这个数,
# 如果不相等,那就说明该有序列表中不存在这个数

# 同时bisect还提供了插入操作,插入一个值过后继续维持有序,
# 但是时间复杂度是O(n),所以就不用考虑这种操作了,可以考虑用堆

输出:

[1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8]
10
1
3
0
1
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45985728/article/details/123850789

python vtk 读取三维raw数据存为stl_jiayou可不可以不qaq的博客-爱代码爱编程

1、安装vtk; 2、读取三维raw、显示、保存为stl; import vtk # Read 3D RAW image reader=vtk.vtkImageReader() # reader.SetDataScalarType(vtk.VTK_UNSIGNED_SHORT) # unsigned int16 reader.SetDataScal

python的"stl队列"-爱代码爱编程

from queue import Queue #LILO队列 q = Queue() #创建队列对象 q.put(0) #在队列尾部插入元素 q.put(1) q.put(2) print('LILO队列',q.queue) #查看队列中的所有元素 print(q.get()) #返回并删除队列头部元素 print(q.queue) from

stl+python+图像处理-学习资源-爱代码爱编程

1、C++_STL学习网站 CPlusPlus.com CppReference.com gcc.gnu.org 2、Python学习书籍及网站 《Python Crash Course》 《Learn Python the

gdb中python扩展脚本打印stl容器内容-爱代码爱编程

gdb 调试的时候经常需要打印stl容器,正常gdb打印无法打印容器内容,不方便查看数据和问题,增加几行简单脚本即可实现,在.gdbinit文件中增加如下配置: python import sys sys.path.insert(0, "文件的路径") from libstdcxx.v6.printers import register_libstdcx

STL分解 Python实现-爱代码爱编程

""" Issues: "ImportError: cannot import name '_maybe_get_pandas_wrapper_freq' from 'statsmodels.tsa.filters._utils' " install an old version of statsmodel works "pip install stat

python内置数据结构和stl_用SWIG向Python提供C++里STL的容器-爱代码爱编程

用SWIG向Python提供C++里STL的容器 2018-03-06 18:10:30 +08 字数:1226 标签: Python C 在Python项目中使用C/C++的代码,除了少数场景,其它都有数据交换的需求。 而C++的vector、map等,则是常见的数据容器。 本文介绍如何利用SWIG,在Python中调用STL的str

python内置数据结构和stl_python里有C++ STL中的set和map吗?-爱代码爱编程

from collections import OrderedDict 这样? 修改: from bisect import insort import numpy as np class SortedDict(): def __init__(self, init_dict=None): if init_dict: self._dict

python stl文件_Python:解析二进制stl文件(Python: parsing binary stl file)-爱代码爱编程

I'm having some difficulties while parsing a binary STL file with Python (2.7.1 32-bit and Windows 7 64). The file is a about 450k in size, but my parser suddenly stops working

c++常用基础STL整理-爱代码爱编程

c++常用STL整理 map①访问②find()③erase()④size() clear()map常见用途queue①访问:front() back()②push() pop()③empty() size()queue常见用途stack①访问:top() / 出入栈:push(),pop()②empty(), size()stack常见用途pai

Python常用STL及常用库函数-爱代码爱编程

Python常用STL及常用库函数 关于python的基础知识可以参考:Python基础 /** * str * List * Queue * stk * Deque 双端队列 * Set * Map * BitSet * Pair * 位运算 * 常用库函数: * 翻转、去重、随机打乱、sort * lo

c语言栈 stl 常用函数,【转】C++STL 常用 函数 用法-爱代码爱编程

学完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写。 后来我发现了qt,opencv,opengl,原来,c++好玩的狠。 在这些图形库之外,最常用的可能就是STL,这个东西由于当时学c++的时候迷迷糊糊,完全是一头雾水,上学期数据结构之后开始有点儿开窍了,现在把才c++ST

【刷题】C++刷题中常用的STL中相关内容-爱代码爱编程

处理题目的输入输出 vector中,pair类型使用 pair<int, int> node = make_pair(0, 1); vector<pair<int, int> > vec; vec.push_back(node); map和unordered_map 1. 遍历(正序&&逆序)

C++常用STL容器--string-爱代码爱编程

C++常用STL容器--string 特点string构造函数string赋值string字符串拼接string字符串查找、替换string字符串比较string字符获取string 插入和删除string 截取子串 string是C++风格的字符串,但本质上是一个类 特点 string类内部封装了很多成员方法,例如:查找find,拷贝co

解析c++ stl容器list区别于python的list-爱代码爱编程

class template std::list 前言 📄本文内容:C++ STL list📇 所属专栏:C/C++ | 全面理解C++ STL标准模板库👤 作者主页:紫荆鱼📆 创作时间:2022-1-3📟 小