python【数据结构】

1. 列表

Python 中列表是可变的,这是它区别于字符串元组的最重要的特点;即,列表可以修改,而字符串和元组不能。

以下是 Python 中列表的方法:

方法描述
list.append(x)把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。
list.extend(L)通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。
list.insert(i, x)在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。
list.remove(x)删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。
list.pop([i])从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除。(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。)
list.clear()移除列表中的所有项,等于del a[:]。
list.index(x)返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
list.count(x)返回 x 在列表中出现的次数。
list.sort()对列表中的元素进行排序。
list.reverse()倒排列表中的元素。
list.copy()返回列表的浅复制,等于a[:]。

示例:

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。

1.1 将列表当做栈使用

栈是后进先出(LIFO)数据结构,列表提供了一些如 append() 和 pop() 方法,使其非常适合用于栈操作。用 append() 方法可以把一个元素添加到栈顶,用不指定索引的 pop() 方法可以把一个元素从栈顶释放出来。

栈操作

  • 压入(Push):将一个元素添加到栈的顶端。
  • 弹出(Pop):移除并返回栈顶元素。
  • 查看栈顶元素(Peek/Top):返回栈顶元素而不移除它。
  • 检查是否为空(IsEmpty):检查栈是否为空。
  • 获取栈的大小(Size):获取栈中元素的数量。

示例:

# 定义一个栈类
class Stack:# 初始化方法,创建一个空列表作为栈的底层数据结构def __init__(self):self.stack = []# 入栈方法,将元素添加到栈的顶部def push(self, item):self.stack.append(item)# 出栈方法,移除并返回栈顶元素def pop(self):# 如果栈不为空,则弹出栈顶元素并返回if not self.is_empty():return self.stack.pop()# 如果栈为空,则抛出索引错误else:raise IndexError("pop from empty stack")# 查看栈顶元素,但不移除它def peek(self):# 如果栈不为空,则返回栈顶元素if not self.is_empty():return self.stack[-1]# 如果栈为空,则抛出索引错误else:raise IndexError("peek from empty stack")# 判断栈是否为空def is_empty(self):# 如果栈的长度为0,则返回True,表示栈为空return len(self.stack) == 0# 获取栈的大小def size(self):# 返回栈的长度,即栈中元素的数量return len(self.stack)# 使用示例
# 创建一个栈对象
stack = Stack()
# 将元素1、2、3依次入栈
stack.push(1)
stack.push(2)
stack.push(3)# 输出操作信息
print("栈顶元素:", stack.peek())  # 输出: 栈顶元素: 3
print("栈大小:", stack.size())    # 输出: 栈大小: 3
print("弹出元素:", stack.pop())  # 输出: 弹出元素: 3
print("栈是否为空:", stack.is_empty())  # 输出: 栈是否为空: False
print("栈大小:", stack.size())    # 输出: 栈大小: 2

1.2 将列表当作队列使用

队列是一种先进先出(FIFO)的数据结构,但由于列表的特点,直接使用列表来实现队列时,如果频繁地在列表的开头插入或删除元素,性能会受到影响(时间复杂度是 O(n)),因此并不是最优的选择。为了解决这个问题,Python 提供了双端队列 collections.deque,它提供了 O(1) 时间复杂度的添加和删除操作,可以在两端高效地添加和删除元素。

使用列表实现队列:

# 定义一个队列类
class Queue:# 初始化方法,创建一个空列表作为队列的底层数据结构def __init__(self):self.queue = []# 入队方法,将元素添加到队列的尾部def enqueue(self, item):self.queue.append(item)# 出队方法,移除并返回队列的首部元素def dequeue(self):# 如果队列不为空,则移除并返回队首元素if not self.is_empty():return self.queue.pop(0)# 如果队列为空,则抛出索引错误else:raise IndexError("dequeue from empty queue")# 查看队首元素,但不移除它def peek(self):# 如果队列不为空,则返回队首元素if not self.is_empty():return self.queue[0]# 如果队列为空,则抛出索引错误else:raise IndexError("peek from empty queue")# 判断队列是否为空def is_empty(self):# 如果队列的长度为0,则返回True,表示队列为空return len(self.queue) == 0# 获取队列的大小def size(self):# 返回队列的长度,即队列中元素的数量return len(self.queue)# 使用示例
# 创建一个队列对象
queue = Queue()
# 将元素'a'、'b'、'c'依次入队
queue.enqueue('a')
queue.enqueue('b')
queue.enqueue('c')print("队首元素:", queue.peek())   # 输出: 队首元素: a
print("队列大小:", queue.size())   # 输出: 队列大小: 3
print("移除的元素:", queue.dequeue())   # 输出: 移除的元素: a
print("队列是否为空:", queue.is_empty())   # 输出: 队列是否为空: False
print("队列大小:", queue.size())   # 输出: 队列大小: 2

使用 collections.deque 实现队列:

# 导入collections模块中的deque类,deque是一种双端队列
from collections import deque# 创建一个空队列
queue = deque()# 向队尾添加元素'a'、'b'、'c'
queue.append('a')
queue.append('b')
queue.append('c')print("队列状态:", queue)  # 输出: 队列状态: deque(['a', 'b', 'c'])# 从队首移除元素,并将其赋值给变量first_element
first_element = queue.popleft()
print("移除的元素:", first_element)  # 输出: 移除的元素: a
print("队列状态:", queue)  # 输出: 队列状态: deque(['b', 'c'])# 查看队首元素(不移除),直接通过索引0访问队首元素
front_element = queue[0]
print("队首元素:", front_element)   # 输出: 队首元素: b# 检查队列是否为空,通过判断队列的长度是否为0来实现
is_empty = len(queue) == 0
print("队列是否为空:", is_empty)   # 输出: 队列是否为空: False# 获取队列的大小,即队列中元素的数量
size = len(queue)
print("队列大小:", size)   # 输出: 队列大小: 2

1.3 列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]
>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

嵌套列表:

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

1.4 del 语句

使用 del 语句可以从一个列表中根据索引来删除一个元素,而不是值来删除元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]


2. 元组

元组由若干逗号分隔的值组成,在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号, 不过括号通常是必须的(如果元组是更大的表达式的一部分)。

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))


3. 集合

集合是一个无序不重复元素的集。基本功能包括关系测试消除重复元素。可以用大括号 {} 创建集合。如果要创建一个空集合必须用 set() 而不是 {} ;后者创建一个空的字典。

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 删除重复的
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 检测成员
True
>>> 'crabgrass' in basket
False>>> # 以下演示了两个集合的操作
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # a 中唯一的字母
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 在 a 中的字母,但不在 b 中
{'r', 'd', 'b'}
>>> a | b                              # 在 a 或 b 中的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 在 a 和 b 中都有的字母
{'a', 'c'}
>>> a ^ b                              # 在 a 或 b 中的字母,但不同时在 a 和 b 中
{'r', 'd', 'b', 'm', 'z', 'l'}

集合也支持推导式:

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}


4. 字典

序列是以连续的整数为索引,而字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。可以把字典看做无序的键=>值对集合。在同一个字典之内,关键字必须是互不相同一对大括号表示创建一个空的字典:{}。

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

构造函数 dict() 直接从键值对元组列表中构建字典。如果有固定的模式,列表推导式指定特定的键值对:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}

字典推导可以用来创建任意键和值的表达式词典:

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

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

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

相关文章

java mail 535 Login Fail. Please enter your authorization code to login

报错信息提示查看 https://service.mail.qq.com/detail/0/53 帮助页面意思就是说你要使用授权码登录, 但是授权码我已经正确的设置上去了 后面从 QQ邮箱出现错误 Please enter your authorization code to_邮件群发-双翼邮件群发软件官方网 看到 账户 需要是 QQ号 例如…

怎样修改el-table主题样式

起因:el-table有主题样式,部分需要单独设置 环境:ideanodejs插件谷歌浏览器 第一步:找到scss文件: 谷歌浏览器打开表格页面,ctrlshifti打开开发者工具,点击后鼠标移动到表格单元格上单击一下…

记录一次面试中被问到的问题 (HR面)

文章目录 一、你对公司的了解多少二、为什么对这个岗位感兴趣三、不能说的离职原因四、离职原因高情商回复五、你的核心优势是什么六、你认为你比其他面试候选人的优势是什么七、不要提及情感 一、你对公司的了解多少 准备要点: 在面试前,对公司进行充分…

从零开始:使用VSCode搭建Python数据科学开发环境

引言 在数据科学领域,一个高效、稳定的开发环境是成功的关键。本文将详细介绍如何使用Visual Studio Code搭建一个完整的Python数据科学开发环境。通过本指南,您将学会: 安装和配置VSCode,包括基本设置和快捷键配置设置Python开…

【C++习题】20. 两个数组的交集

题目:349. 两个数组的交集 - 力扣(LeetCode) 链接🔗:349. 两个数组的交集 - 力扣(LeetCode) 题目: 代码: class Solution { public:// 函数功能:求两个数组…

【深度学习】深度(Deep Learning)学习基础

深度学习(Deep Learning) 深度学习是一种基于人工神经网络的机器学习方法,通过多个层次(深度)的神经网络从数据中自动学习特征和模式。它是人工智能的一个核心领域,尤其在处理复杂数据(如图像、…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作,以控制用户对数据库的访问权限。通过账户管理,可以设置用户名、密码、主机地址等信息,确保数据库的安全性和可控性。例如,使用 CREATE USER 创建用户,ALTER…

STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显

资料下载地址:STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线:串口1:PA9 PA10 OELD :PB6 PB7 数码管使用:MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…

决定系数(R²分数)——评估回归模型性能的一个指标

目录 1.定义 2.计算举例 3. 结果分析 1.定义 R(R平方)分数,也称为决定系数,是用来评估回归模型性能的一个指标。它表示自变量解释因变量变异性的比例。R分数的取值范围通常在0到1之间,其值越接近1,说明…

代码随想录算法训练营day23

代码随想录算法训练营 —day23 文章目录 代码随想录算法训练营前言一、39. 组合总和二、40.组合总和II三、131.分割回文串总结 前言 今天是算法营的第23天,希望自己能够坚持下来! 今日任务: ● 39. 组合总和 ● 40.组合总和II ● 131.分割回…

【电子通识】PWM驱动让有刷直流电机恒流工作

电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作,其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时,电机会怎样工作呢&#xff1…

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI,点击按钮后,会变成为一个监听按钮。旁边会有音符飞入这个监听按钮,最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

精度论文:【Coordinate Attention for Efficient Mobile Network Design】

Coordinate Attention for Efficient Mobile Network Design 《用于高效移动网络设计的坐标注意力机制》1.引言2.相关工作2.1 移动网络架构2.2 注意力机制 3. 坐标注意力3.1. 回顾SE注意力 (Squeeze-and-Excitation Attention)3.2. 坐标注意力块3.2.1 坐标信息嵌入3.2.2 坐标注…

高等数学学习笔记 ☞ 一元函数微分的基础知识

1. 微分的定义 (1)定义:设函数在点的某领域内有定义,取附近的点,对应的函数值分别为和, 令,若可以表示成,则称函数在点是可微的。 【 若函数在点是可微的,则可以表达为】…

openai swarm agent框架源码详解及应用案例实战

文章目录 简介数据类型Agent类Response类Result类Swarm类run_demo_loop交互式会话 基础应用agent-handsofffunction-callingcontext_variablestriage_agent 高阶应用通用客服机器人(support bot)构建航班服务agent 参考资料 openai 在24年10月份开源了一个教育性质的多agents协…

【测试】——Cucumber入门

📖 前言:Cucumber框架是行为驱动(BDD)框架的一种,通过自然语言站在功能使用者视角,描述编写测试用例。简单来说就是通过feature文件编写脚本,脚本对应java写的方法,会有一个启动器配…

无网络时自动切换备用网络环境

目录 背景目标为什么需要做自动网络切换网络切换手段 网络环境实现思路和代码部署脚本开机自动执行附录连接两个网络时的路由问题 背景 目标 学校实验室有两个网络环境,我电脑使用网线连接稳定但低速的网络A,使用WiFi连接高速但不稳定的网络B。因此&am…

【微服务】1、引入;注册中心;OpenFeign

微服务技术学习引入 - 微服务自2016年起搜索指数持续增长,已成为企业开发大型项目的必备技术,中高级java工程师招聘多要求熟悉微服务相关技术。微服务架构介绍 概念:微服务是一种软件架构风格,以专注于单一职责的多个响应项目为基…

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

本文作者: 容器服务团队:刘佳旭、冯诗淳 可观测团队:竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准(CNCF Survey[1])。随着承接的业务规模越来越大,用户也在使…

docker+ffmpeg+nginx+rtmp 拉取摄像机视频

1、构造程序容器镜像 app.py import subprocess import json import time import multiprocessing import socketdef check_rtmp_server(host, port, timeout5):try:with socket.create_connection((host, port), timeout):print(f"RTMP server at {host}:{port} is avai…