Python 标准库与数据结构
Python的标准库提供了丰富的内置数据结构和函数,使用这些工具能为我们提供一套强有力的工具。
需要注意的是,相比C++与Java,Python的一些特点:
- Python不需要显式声明变量类型
- Python没有模板(Template)的概念,因为Python是动态类型语言
- Python的标准库导入更简单,只需要
import相关模块即可
我们主要介绍以下几种数据结构:
list:列表set:集合dict:字典queue和deque:队列heapq:堆
如果在比赛的过程中,忘记了某些函数的使用或者拼写,可能查看比赛机器桌面上的手册,会有这些函数的具体使用方法。
1. 迭代器说明
在Python中,迭代器的概念比C++更简单。所有的Python集合都是可迭代的,不需要显式声明迭代器。我们可以直接使用for循环进行遍历:
numbers = [1, 2, 3, 4, 5]
for num in numbers:print(num) # 输出: 1 2 3 4 5# 如果需要索引,可以使用enumerate
for index, num in enumerate(numbers):print(f"索引 {index}: {num}")
2. 数据结构详解
2.1 list(列表)
list是Python中最基础的序列数据结构,本身则就具有可变数组的能力。
基本操作:
# 创建列表
lst = [] # 创建空列表
lst = [1, 2, 3] # 创建包含元素的列表
lst = [0] * 5 # 创建长度为5的列表,所有元素为0# 常用操作
lst.append(x) # 在末尾添加元素x
lst.pop() # 删除并返回末尾元素
lst.pop(i) # 删除并返回索引i处的元素
lst.insert(i, x) # 在索引i处插入元素x
len(lst) # 返回列表长度
lst[i] # 访问第i个元素
例子:
numbers = []
numbers.append(1) # numbers = [1]
numbers.append(2) # numbers = [1, 2]
numbers.append(3) # numbers = [1, 2, 3]
print(len(numbers)) # 输出: 3
numbers.pop() # numbers = [1, 2]
2.2 set(集合)
set是Python中的无序不重复元素集合,实现方式是哈希表,而不是C++中的红黑树。这意味着Python的set操作复杂度是O(1),而不是O(log n)。
基本操作:
s = set() # 创建空集合
s.add(x) # 添加元素x
s.remove(x) # 删除元素x(元素不存在会报错)
s.discard(x) # 删除元素x(元素不存在不会报错)
len(s) # 返回元素个数
x in s # 检查元素是否在集合中
例子:
s = set()
s.add(3) # s = {3}
s.add(1) # s = {1, 3}
s.add(2) # s = {1, 2, 3}
s.add(2) # s仍然是{1, 2, 3}
print(2 in s) # 输出: True
2.3 dict(字典)
dict是Python中的键值对容器,同样基于哈希表实现,操作复杂度是O(1)。
基本操作:
d = {} # 创建空字典
d[key] = value # 添加或更新键值对
d.pop(key) # 删除并返回键对应的值
len(d) # 返回键值对数量
key in d # 检查键是否存在
例子:
scores = {}
scores["Alice"] = 95 # 记录Alice的分数
scores["Bob"] = 89 # 记录Bob的分数
print(scores["Alice"]) # 输出: 95
2.4 queue和deque(队列)
Python提供了collections.deque作为双端队列实现,功能比C++的queue更强大。
from collections import deque# 基本操作
q = deque() # 创建空队列
q.append(x) # 在右侧添加元素
q.appendleft(x) # 在左侧添加元素
q.pop() # 删除并返回右侧元素
q.popleft() # 删除并返回左侧元素
len(q) # 返回元素个数
例子:
from collections import deque
q = deque()
q.append(1) # q = deque([1])
q.append(2) # q = deque([1, 2])
q.append(3) # q = deque([1, 2, 3])
print(q[0]) # 输出: 1
q.popleft() # q = deque([2, 3])
2.5 heapq(堆)
Python通过heapq模块提供堆的功能,默认是小根堆(最小元素在顶部),注意,该模块使用需要一个容器来进行操作。
基本操作:
import heapqheap = [] # 创建空列表作为堆
heapq.heappush(heap, x) # 将元素x压入堆
heapq.heappop(heap) # 弹出并返回最小元素
heap[0] # 查看最小元素
len(heap) # 返回元素个数
例子:
import heapqheap = []
heapq.heappush(heap, 3) # heap = [3]
heapq.heappush(heap, 1) # heap = [1, 3]
heapq.heappush(heap, 4) # heap = [1, 3, 4]
print(heap[0]) # 输出: 1(最小元素)
3. 补充说明-关于有序集合
Python的set和dict不支持像C++那样的二分查找API(lower_bound、upper_bound),因为它们是基于哈希表实现的。在python组的题目中,也基本不会出现相关的题。
5. 实践与例题
5.1 真题-连连看

很明显,需要求的是每条对角线上的相同数值的对数,如下图:

我们可以枚举每一条45度角对角线,然后进行从上到下、或是从下到上进行遍历,一边遍历一边记录当前数值的数量即可,使用map 进行维护:
def get_l(x, y):global ansmp = {}while x <= n and y <= m:if a[x][y] not in mp:mp[a[x][y]] = 0ans += mp[a[x][y]] mp[a[x][y]] += 1x += 1y += 1def get_r(x, y):global ansmp = {}while x > 0 and y <= m:if a[x][y] not in mp:mp[a[x][y]] = 0ans += mp[a[x][y]] # 当 key 不存在 mp 中时,默认值为 0mp[a[x][y]] += 1x -= 1y += 1n, m = map(int, input().split())
a = [[0] * (m + 1) for _ in range(n + 1)] # 创建二维数组 a,索引从 1 开始
ans = 0# 读取输入
for i in range(1, n + 1):a[i] = [0] + list(map(int, input().split())) # 读取每一行,并加上前导零,保持从索引 1 开始# 遍历处理主对角线和另外一条对角线
for i in range(1, n + 1):get_l(i, 1) # 处理主对角线get_r(i, 1) # 处理另外一条对角线for i in range(2, m + 1):get_l(1, i)get_r(n, i)print(ans * 2)
5.2 哈希表的实现-set

我们直接使用 set 即可
n = int(input()) # 读取输入的整数 n
st = set() # 创建一个空的集合for _ in range(n):opt, m = input().split() # 读取操作符和整数 mm = int(m) # 将 m 转换为整数if opt == 'I': # 如果操作符是 'I',则插入元素 mst.add(m)elif m not in st: # 如果操作符不是 'I' 且 m 不在集合中print("No")else:print("Yes")
5.3 堆与优先队列

我们使用优先队列解决:
import heapqn = int(input()) # 读取操作次数 n
pq = [] # 使用列表来模拟小根堆for _ in range(n):op = input().split() # 读取操作符if op[0] == "push":x = int(op[1])heapq.heappush(pq, x) # elif op[0] == "remove":if not pq:print("empty")else:heapq.heappop(pq) # 弹出堆顶元素elif op[0] == "min":if not pq:print("empty")else:print(pq[0]) # 输出堆顶元素elif op[0] == "print":k = int(op[1])if 0 < k <= len(pq):temp = []for _ in range(k):temp.append(pq[0]) # 获取堆顶元素heapq.heappop(pq) # 弹出堆顶元素print(*temp) # 打印出来
5.4 小蓝的图书馆

题,要求我们,每一个作者对应一个书的列表,我们可能使用map,同时套上vector。
mp = {}n = int(input()) # 读取操作次数 nfor _ in range(n):arg = input().split() # 读取操作指令if arg[0] == "add":book, au = arg[1], arg[2] # 读取书名和作者if au not in mp:mp[au] = []mp[au].append(book) # 将书名添加到对应作者的列表中else:au = arg[1] # 读取作者名if au not in mp:mp[au] = []print(len(mp[au])) # 输出该作者的书籍数量相关文章:
Python 标准库与数据结构
Python的标准库提供了丰富的内置数据结构和函数,使用这些工具能为我们提供一套强有力的工具。 需要注意的是,相比C与Java,Python的一些特点: Python不需要显式声明变量类型Python没有模板(Template)的概念,因为Pytho…...
NIO入门
IO和NIO的区别: IO:通过流处理数据,仅支持阻塞IO。 核心组件:InputStream /OutputStream用于字节的读写,Reader / Writer:用于字符流的读写。读取过程中无法被中断,是阻塞式IO。 NIO:通过管道处…...
leetcode 用队列模拟栈
这个其实只需要一个队列就可以的,但是我这里用的是2个队列进行替换, 先转n-1个到空的队列, 然后在此基础上进行队列的互换,把剩下的那一个元素所在的队列进行poleft操作就可以了。 class MyStack:def __init__(self):self.q1_i…...
spring security 使用的过滤器还是拦截器
spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架,用于保护 Java 应用程序。它主要使用过滤器(Filters)来实现安全功能,而不是拦截器(Interceptors)。不过,它也提…...
大疆上云api介绍
概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...
2025-03-25 Unity 网络基础4——TCP同步通信
文章目录 1 Socket1.1 Socket 类型1.2 构造 Socket1.3 常用属性1.4 常用方法 2 TCP 通信2.1 服务端配置2.2 客户端配置2.3 进行通信2.4 多设备通信 3 区分消息 1 Socket Socket 是 C# 提供的网络通信类(其它语言也有对应的 Socket 类),是…...
C++进阶(一)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 本篇博客是讲解函数的重载以及引用的知识点的。 文章目录 前言 1.函数重载 1.1何为函数重载 1.2函数重载的作用 1.3函数重载的实现 2.引用 2.1何为引用 2.2定义引用 2.3引用特性 2.4常引用 2…...
深度解读DeepSeek:开源周(Open Source Week)技术解读
深度解读DeepSeek:开源周(Open Source Week)技术解读 深度解读DeepSeek:源码解读 DeepSeek-V3 深度解读DeepSeek:技术原理 深度解读DeepSeek:发展历程 文章目录 一、开源内容概览Day1:FlashMLAD…...
AI Agent开发与应用
AI Agent开发与应用:本地化智能体实践——本地化智能体开发进展与主流框架分析 我要说的都在ppt里面了,相关复现工作请参考ai agent开发实例 OpenManus Dify Owl 第二个版本更新了对话的框架,通过gradio做了一个全新的界面 只测试了阿里云…...
石斛基因组-文献精读122
A chromosome-level Dendrobium moniliforme genome assembly reveals the regulatory mechanisms of flavonoid and carotenoid biosynthesis pathways 《染色体水平的石斛基因组组装揭示了黄酮类和胡萝卜素生物合成途径的调控机制》 摘要 石斛(Dendrobium monil…...
javaSE.多维数组
1 final 引用类型 final int[] arr 继承Object 的引用类型,不能改变引用的对象 存的其实是引用 数组类型数组,其实存的是引用 int [][] arr new int[][] { {1,2,3}, {4,5,6} };int [] a arr[0]; int [] b arr[1];...
Spring IOC容器详解:深入理解控制反转与依赖注入
一、什么是IOC? 在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类…...
Python条件处理,新手入门到精通
Python条件处理,新手入门到精通 对话实录 **小白**:(崩溃)我写了if x 1:,为什么Python会报错? **专家**:(推眼镜)**是赋值,才是比较**!想判断相…...
JPA实体类注解缺失异常全解:从报错到防御!!!
🚨 JPA实体类注解缺失异常全解:从报错到防御 🛡️ 一、💥 问题现象速览 // 经典报错示例 Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.Product典型症状: &…...
Spring 源码硬核解析系列专题(三十二):Spring Cloud LoadBalancer 的负载均衡源码解析
在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Cloud Alibaba,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡组件,替代 Ribbon,支持服务发现和负载均衡策略。本篇将深入 Spring…...
生成式媒介革命已至,搜索如何借力DeepSeek破局?
作为前沿AI技术的代表,DeepSeek不仅突破了传统大模型的算力瓶颈,更以“高性能低成本开源生态”的特性,重塑传播生态。对于搜索行业从业者而言,这场技术变革既是机遇,也是挑战。 DeepSeek的三大“杀手锏”,…...
【Vue3入门1】02- Vue3的基本操作(上)
本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...
【C语言】多进程/多线程
【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务,提高了系统的资源利用率和程序的运行效率…...
模糊数学 | 模型 / 集合 / 关系 / 矩阵
注:本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常,请看原文。 模糊数学模型:隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…...
Browserlist 使用指南:应对浏览器兼容性问题的解决方案
前言 在前端开发中,我们经常需要处理各种不同的浏览器兼容性问题。每个浏览器的版本众多,处理这些问题可能会让人感到头疼。幸运的是,有一个名为 Browserlist 的工具可以大大简化这项工作。本文将介绍 Browserlist 的作用和使用方法…...
QinQ项展 VLAN 空间
随着以太网技术在网络中的大量部署,利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特,仅能表示 4096 个 VLAN,无法满足城域以太网中标识大量用户的需求,于是 QinQ 技术应运而生。…...
数据结构—树(java实现)
目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...
Unity射击游戏手榴弹笔记
数据 在物品系统增加一个新的物品类,手榴弹类,定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组;手榴弹的预制体需要可拾取的、扔出的;背包界面增加背包内的手榴弹、场景里的手榴弹、别人…...
S32K144外设实验(七):FTM输出多路互补带死区PWM
文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…...
SingleMod
SingleMod SingleMod是一种深度学习模型,专为利用纳米孔直接RNA测序(DRS)数据在单RNA分子中精确检测m6A修饰而设计。该模型通过深度多实例回归框架进行训练,能够充分利用广泛的甲基化率标签。SingleMod是一个通用框架,可轻松适配其他核酸修饰的检测模型训练。 注意: Si…...
[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]
常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接; /proc/pid…...
单纯形法之大M法
1. 问题背景与标准化 在求解某些线性规划问题时,往往难以直接找到初始的基本可行解。特别是当约束中存在等式或 “≥” 类型的不等式时,我们需要引入人工变量来构造一个初始可行解。 考虑如下标准形式问题(假设为最大化问题)&am…...
各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写
上一篇下一篇RNN(中集)待编写 代码详解 pytorch 官网主要有两个可调用的模块,分别是 nn.RNNCell 和 nn.RNN ,下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的,只需要将对输入…...
DeepSeek 发布DeepSeek-V3-0324 版本 前端与网页开发能力、推理与多任务能力提升
DeepSeek 发布 DeepSeek-V3-0324 版本 DeepSeek 发布 DeepSeek-V3-0324 版本,在其前代模型 DeepSeek-V3 的基础上进行了显著升级。 该模型专注于中文和多语言文本生成、推理、代码编写等综合能力的提升,支持 Function Calling(函数调用&…...
航班时间 | 第九届蓝桥杯省赛C++A组
小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。 小 hh 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于…...
