Python 标准库与数据结构

Python的标准库提供了丰富的内置数据结构和函数,使用这些工具能为我们提供一套强有力的工具。

需要注意的是,相比C++与Java,Python的一些特点:

  1. Python不需要显式声明变量类型
  2. Python没有模板(Template)的概念,因为Python是动态类型语言
  3. 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]))  # 输出该作者的书籍数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40023.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE3 路由配置

1.下载 VueRouter 模块 在命令行中输入 yarn add vue-router 2.导⼊相关函数 在自己创建的router/index.js 文件中 import { createRouter, createWebHashHistory } from vue-router 3.创建路由实例 在自己创建的router/index.js 文件中 const theFirstRouter ()>{return…

算法训练营第二十三天 | 贪心算法(一)

文章目录 一、贪心算法理论基础二、Leetcode 455.分发饼干二、Leetcode 376. 摆动序列三、Leetcode 53. 最大子序和 一、贪心算法理论基础 贪心算法是一种在每一步选择中都采取当前状态下的最优决策&#xff0c;从而希望最终达到全局最优解的算法设计技术。 基本思想 贪心算…

Apifox下载安装

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Apifox下载安装使用1. 下载2. 安装 &#x1…

如何区别在Spring Boot 2 和 Spring Boot 3 中使用 Knife4j:集成与配置指南

在现代的 Web 开发中&#xff0c;API 文档是不可或缺的一部分。Knife4j 是基于 Swagger 的增强工具&#xff0c;它不仅提供了更友好的 API 文档界面&#xff0c;还支持更多实用的功能&#xff0c;如离线文档导出、全局参数配置等。本文将详细介绍如何在 Spring Boot 2 和 Sprin…

超融合服务器与普通服务器的具体区别

超融合服务器与普通服务器的具体区别 超融合服务器&#xff08;Hyper-Converged Infrastructure, HCI&#xff09;与传统服务器在架构设计、功能整合、管理方式、性能表现及适用场景等方面存在显著差异。以下从多个维度进行详细对比分析&#xff1a; 一、硬件架构与资源整合 集…

(基本常识)C++中const与引用——面试常问

作者&#xff1a;求一个demo 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 内容通俗易懂&#xff0c;没有废话&#xff0c;文章最后是面试常问内容&#xff08;建议通过标题目录学习&#xff09; 废话不多…

数据库与表的操作

1. SQL 分类 SQL 根据功能分为以下几类&#xff1a; **DDL **: 定义数据库对象&#xff08;库、表、列、索引等&#xff09; 常用语句&#xff1a;CREATE, DROP, ALTER, RENAME, TRUNCATE示例&#xff1a;CREATE TABLE t_user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHA…

2025年渗透测试面试题总结-某shopee -红队-Singapore(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 shopee -红队-Singapore 一、Linux提权方式扩展分析 二、入侵痕迹清除技术 三、真实IP发现技术 四、…

GeoChat : Grounded Large Vision-Language Model for Remote Sensing论文精读

GeoChat : Grounded Large Vision-Language Model for Remote Sensing 是一个针对遥感场景的llm&#xff0c;提供支持多任务对话&#xff08;对高分辨率遥感图像&#xff09;。也造了个数据集。 一些思考&#xff1a; 文中提到的局限性&#xff1a;小物体和多框预测较难。小物…

基于STM32的PID算法控制电机调速

一、制作目标 以STM32F103C8T6单片机作为主控&#xff0c;使用PID控制算法&#xff0c;控制TB6612FNG电机驱动板模块驱动直流减速电机&#xff08;带AB相编码器&#xff09;&#xff0c;实现任意设定转速的电机转速动态控制&#xff0c;类似于汽车的定速巡航功能&#xff0c;可…

系统思考—看见未来

感谢上海财经大学终身教育学院的持续邀请&#xff01;每个月&#xff0c;都会带着不同的思维火花&#xff0c;走进财大与学员们一起探索系统思考的奥秘。 这次为宜宾市的干部们带来了一场深刻的学习体验。通过系统思考&#xff0c;帮助大家从整体视角去发现问题、分析问题、解…

qwindowkit 编译教程

1、Windows编译及示例 1.1 下载源码 https://github.com/stdware/qwindowkit 1.2 cmake编译 1.3 VS构建 1.4 编译成功

HashMap的位操作是什么?HashSet 的 contains 方法复杂度是多少?红黑树简单讲一下?

一、HashMap 的位操作设计 HashMap 使用位运算优化哈希计算与索引定位&#xff0c;核心场景如下&#xff1a; 哈希扰动函数 计算键的哈希值时&#xff0c;将高16位与低16位异或&#xff1a; static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hash…

软件开发过程中常用的调试工具(gdb)

gdb 因为我们公司其中脚本中有rk的gdb调试工具脚本&#xff0c;内部只需要将其打开后进行编译即可&#xff1a; 需要将编译出来的cvr_app 第一种&#xff1a;使用gdb将app给跑起来&#xff1a;gdb cvr_app 然后在出现问题时&#xff1a; 输入bt&#xff0c;可以打印出当前…

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…

Qt6相对Qt5的主要提升(AI总结)

我&#xff1a; Qt 6 相对于5 有哪些新功能&#xff1f; Qt 6 相对于 Qt 5 有诸多新功能和改进&#xff0c;以下是主要的新增特性&#xff1a; 1. 架构和核心库的重构 模块化设计&#xff1a;Qt 6 采用了更加灵活的模块化设计&#xff0c;开发者可以按需引入必要的功能模块&a…

一文解读DeepSeek的安全风险、挑战与应对策略

引言 DeepSeek作为中国领先的AI大模型提供商&#xff0c;凭借其开源、低成本和高性能的优势&#xff0c;迅速在全球AI市场占据重要地位。然而&#xff0c;随着其应用范围的扩大&#xff0c;DeepSeek在数据安全、模型漏洞、网络攻击等方面面临严峻挑战。本文基于最新公开资料&am…

文生图语义识别插件使用(controlnet)

1. 插件下载(github) https://github.com/Mikubill/sd-webui-controlnet https://github.com/lllyasviel/ControlNet2. 模型下载(hugging face) https://github.com/Mikubill/sd-webui-controlnet/wiki/Model-download https://huggingface.co/bdsqlsz/qinglong_controlnet-l…

论华为 Pura X 折叠屏性能检测

在科技浪潮中&#xff0c;折叠屏手机以其创新形态掀起市场热潮。华为 Pura X 作为华为最新折叠手机&#xff0c;承载前沿科技与精湛工艺&#xff0c;成为行业焦点。它融合先进折叠屏技术与优质材质&#xff0c;致力于打破传统手机使用边界&#xff0c;为用户开启全新体验。但产…

多路转接Poll

在之前我们讲过select是最古老的多路转接方案&#xff0c;古老就意味着他不是很方便使用&#xff0c;他需要用户手动保存fd_set这个位图结构&#xff0c;来表示读写事件的关注与否或者就绪性。 而且由于fd_set的大小是固定的&#xff0c;这就意味着他能管理的套接字文件描述符是…