python学习笔记(8)算法(1)数组

 一、数组

数组是存储于一个连续空间且具有相同数据类型的元素集合。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。python中数组一般用列表构造。

1.数组初始化

arr = [0]*5   # [ 0, 0, 0, 0, 0 ]
#或者
arr: list[int] = [0] * 5   # [ 0, 0, 0, 0, 0 ]
#两句代码没有什么区别,第二句这是使用类型提示(type hinting)的方式来声明变量arr的类型为list[int],即整数列表。类型提示在Python中是可选的,它可以帮助代码编辑器提供更好的代码补全和类型检查。

2.访问元素

数组元素被存储在连续的内存空间中,这意味着计算数组元素的内存地址非常容易。在数组中访问元素非常高效,我们可以在 𝑂(1) 时间内随机访问数组中的任意一个元素。

1. 通过索引访问单个元素

  • 正索引:从0开始,表示元素在数组中的位置。例如,对于数组arr = [10, 20, 30, 40, 50],访问第一个元素可以使用arr[0],它将返回10;访问第三个元素可以使用arr[2],它将返回30。
  • 负索引:从 - 1开始,表示从数组末尾开始计数的位置。对于上述arr数组,arr[-1]将返回50(最后一个元素),arr[-2]将返回40(倒数第二个元素)。

2. 通过切片访问多个元素

  • 基本切片操作:使用start:stop:step的语法来获取子数组。例如,对于arr = [10, 20, 30, 40, 50]
    • 获取前三个元素:arr[0:3],它将返回[10, 20, 30]。这里start = 0表示从第一个元素开始(包含第一个元素),stop = 3表示到第四个元素之前(不包含第四个元素)。
    • 如果省略start,例如arr[:3],默认从第一个元素开始,也将返回[10, 20, 30]
    • 如果省略stop,例如arr[2:],表示从第三个元素开始到数组末尾,将返回[30, 40, 50]
  • 带步长的切片操作:步长表示每次取元素的间隔。例如,arr[0:5:2],对于arr = [10, 20, 30, 40, 50],步长为2,将返回[10, 30, 50]
    • 如果步长为 - 1,可以用来反转数组,例如arr[::-1]将返回[50, 40, 30, 20, 10]

3. 通过条件筛选访问元素

  • 可以使用条件表达式来筛选数组中的元素。例如,对于arr = [10, 20, 30, 40, 50],要获取所有大于30的元素,可以使用以下代码:
result = [num for num in arr if num > 30]
print(result)  # 输出: [40, 50]

3.插入元素

数组元素在内存中是“紧挨着的”,它们之间没有空间再存放任何数据。如果想在数组中间插入一个元素,则需要将该元素之后的所有元素都向后移动一位,之后再把元素赋值给该索引。

值得注意的是,由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素“丢失”。

arr=[3]*5def insert(nums, num, index):""" 在数组的索引 index 处插入元素 num"""# 把索引 index 以及之后的所有元素向后移动一位for i in range(len(nums) - 1, index, -1):nums[i] = nums[i - 1]# 将 num 赋给 index 处的元素nums[index] = numinsert(arr, 1, 2)print(arr)
#结果[3, 3, 1, 3, 3]

4.删除元素


同理,若想删除索引 𝑖 处的元素,则需要把索引 𝑖 之后的元素都向前移动一位。

请注意,删除元素完成后,原先末尾的元素变得“无意义”了,所以我们无须特意去修改它。

arr=[1,3,5,7,9]def remove(nums, index):""" 删除索引 index 处的元素"""# 把索引 index 之后的所有元素向前移动一位for i in range(index, len(nums) - 1):nums[i] = nums[i + 1]remove(arr, 2)print(arr)

总的来看,数组的插入与删除操作有以下缺点。
‧ 时间复杂度高:数组的插入和删除的平均时间复杂度均为 𝑂(𝑖) ,其中 𝑖 为数组长度。
‧ 丢失元素:由于数组的长度不可变,因此在插入元素后,超出数组长度范围的元素会丢失。
‧ 内存浪费:我们可以初始化一个比较长的数组,只用前面一部分,这样在插入数据时,丢失的末尾元素
都是“无意义”的,但这样做会造成部分内存空间浪费。

5.遍历数组


在大多数编程语言中,我们既可以通过索引遍历数组,也可以直接遍历获取数组中的每个元素:

一、使用for循环遍历

  1. 直接遍历元素
    • 这是最常见的方式,语法简单直接。
    • 示例:
      arr = [1, 2, 3, 4, 5]
      for element in arr:print(element)
      这种方式直接遍历数组中的每个元素,不需要关心索引。每次循环,变量element都会被赋值为数组中的下一个元素。
  2. 同时获取索引和元素(使用enumerate函数)
    • 有时候需要同时知道元素的索引和值。
    • 示例:
      arr = [1, 2, 3, 4, 5]
      for index, element in enumerate(arr):print(f"索引为 {index} 的元素是 {element}")
      这里enumerate函数会返回一个包含索引和元素的元组,在for循环中可以直接解包赋值给indexelement变量。

二、使用while循环遍历

  1. 通过索引遍历
    • 需要手动维护一个索引变量。
    • 示例:
      arr = [1, 2, 3, 4, 5]
      index = 0
      while index < len(arr):print(arr[index])index += 1
      这种方式相对复杂一些,需要自己管理索引变量index,确保它在合法的范围内(小于数组的长度),并且在每次循环后正确地更新索引。

三、使用迭代器遍历(高级用法)

  1. 使用iternext函数
    • 这种方式更接近底层的迭代机制。
    • 示例:
      arr = [1, 2, 3, 4, 5]
      it = iter(arr)
      try:while True:element = next(it)print(element)
      except StopIteration:pass
      首先使用iter函数获取数组的迭代器,然后使用next函数不断获取下一个元素,直到迭代器抛出StopIteration异常,表示已经遍历完所有元素。这种方式在实际应用中较少使用,但在一些特殊场景(如自定义迭代器)下非常有用。

6.查找元素


在数组中查找指定元素需要遍历数组,每轮判断元素值是否匹配,若匹配则输出对应索引。
因为数组是线性数据结构,所以上述查找操作被称为“线性查找”。

arr=[1,3,5,7,9]def find(nums, target):""" 在数组中查找指定元素"""for i in range(len(nums)):if nums[i] == target:return ireturn -1print(f"7在数组中的index为{find(arr,7)}")

7.扩容数组


在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在
大多数编程语言中,数组的长度是不可变的。
如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个
𝑂(𝑖) 的操作,在数组很大的情况下非常耗时。代码如下所示:

arr=[1,3,5,7,9]def extend(nums, enlarge) :""" 扩展数组长度"""# 初始化一个扩展长度后的数组res = [0] * (len(nums) + enlarge)# 将原数组中的所有元素复制到新数组for i in range(len(nums)):res[i] = nums[i]# 返回扩展后的新数组return resprint(f"扩容后的数组为{extend(arr,7)}")

8.数组的优点与局限性


数组存储在连续的内存空间内,且元素类型相同。这种做法包含丰富的先验信息,系统可以利用这些信息来
优化数据结构的操作效率。
‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。
‧ 支持随机访问:数组允许在 𝑂(1) 时间内访问任何元素。
‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓
存来提升后续操作的执行速度。
连续空间存储是一把双刃剑,其存在以下局限性。
‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。
‧ 长度不可变:数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。
‧ 空间浪费:如果数组分配的大小超过实际所需,那么多余的空间就被浪费了。


9.数组典型应用


数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构。
‧ 随机访问:如果我们想随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实现
随机抽样。
‧ 排序和搜索:数组是排序和搜索算法最常用的数据结构。快速排序、归并排序、二分查找等都主要在数
组上进行。
‧ 查找表:当需要快速查找一个元素或其对应关系时,可以使用数组作为查找表。假如我们想实现字符到
ASCII 码的映射,则可以将字符的 ASCII 码值作为索引,对应的元素存放在数组中的对应位置。
‧ 机器学习:神经网络中大量使用了向量、矩阵、张量之间的线性代数运算,这些数据都是以数组的形式
构建的。数组是神经网络编程中最常使用的数据结构。
‧ 数据结构实现:数组可以用于实现栈、队列、哈希表、堆、图等数据结构。例如,图的邻接矩阵表示实
际上是一个二维数组。

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

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

相关文章

【2024 Optimal Control 16-745】Julia语法

Lecture 2 θ和它的导数符号是通过 Julia 中的变量命名方式实现的 变量 θ 的输入&#xff1a; 在 Julia 中&#xff0c;θ 是一个合法的变量名&#xff0c;就像普通的字母 x 或 y 一样。要输入 θ&#xff0c;可以使用以下方法&#xff1a; 在 Jupyter Notebook 或 Julia REP…

Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着儿童娱乐与教育需求的…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

stm32如何接收舵机的控制信号(而不是控制舵机)

看到很多如何stm32用pwm信号控制舵机的文章,老生常谈了 我来写一个stm32接收pwm信号的例子 ,这个pwm信号是用来控制舵机的 背景: 我需要接收航模接收机的,用来控制舵机的pwm信号, 得到这个信号后,做其他事情. 初版代码 pwm.h#ifndef _pwm_H #define _pwm_H#include "s…

RK3588 HDMI2.1电路参考设计原理

RK3588是瑞芯微电子&#xff08;Rockchip&#xff09;旗下的一款高性能应用处理器芯片&#xff0c;采用了ARM的big.LITTLE架构&#xff0c;结合了四个高性能的Cortex-A76核心和四个高效能的Cortex-A55核心。 big.LITTLE技术通过结合高性能的“大核”&#xff08;big cores&…

【大数据学习 | Spark-Core】详解分区个数

RDD默认带有分区的&#xff0c;那么创建完毕rdd以后他的分区数量是多少&#xff1f; 从hdfs读取文件的方式是最正规的方式&#xff0c;我们通过计算原理可以推出blk的个数和分区数量是一致的&#xff0c;本地化计算。 我们可以发现数据的读取使用的是textInputFormat&#xff…

艾体宝干货丨差异解读:IT 和 OT 网络的数据包和网络分析

IT 网络&#xff08;传统网络&#xff09; IT 网络是现代计算的支柱&#xff0c;为数据交换、通信和处理提供了基础设施。典型应用包括 办公网络数据中心云服务互联网连接 这些网络依靠 TCP/IP、DNS 和 HTTP 等标准协议来促进设备之间的通信。通信路径可能随时发生变化&…

AOC显示器915Sw按键失灵维修记

大家好&#xff0c;我是 程序员码递夫 今天给大家分享的是自己维修老古董AOC液晶显示器按键失灵的的过程&#xff0c;实属DIY记录。 1、引子 家里有台老古董的19寸AOC液晶显示器&#xff08;型号915Sw&#xff09;, 一直作为我的副显示器陪伴着左右&#xff0c;显示还正常&a…

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…

【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.

操作环境&#xff1a; MATLAB 2022a 1、算法描述 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization&#xff0c;简称NGO&#xff09;是一种新兴的智能优化算法&#xff0c;灵感来源于北方苍鹰的捕猎行为。北方苍鹰是一种敏捷且高效的猛禽&#xff0c;广泛分布于北…

戴尔 AI Factory 上的 Agentic RAG 搭载 NVIDIA 和 Elasticsearch 向量数据库

作者&#xff1a;来自 Elastic Hemant Malik, Dell Team 我们很高兴与戴尔合作撰写白皮书《戴尔 AI Factory with NVIDIA 上的 Agentic RAG》。白皮书是一份供开发人员参考的设计文档&#xff0c;概述了实施 Agentic 检索增强生成 (retrieval augmented generation - RAG) 应用…

第十六届蓝桥杯模拟赛(第一期)-Python

本次模拟赛我认为涉及到的知识点&#xff1a; 分解质因数 Python的datetime库 位运算 简单dp 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

数据库中的增删改查操作、聚合函数、内置函数、分组查询

数据库中的增删改查操作、聚合函数、内置函数、分组查询 CRUD简介Create 新增语法示例单⾏数据全列插⼊单⾏数据指定列插⼊多⾏数据指定列插⼊ Retrieve 检索语法⽰例构造数据 Select全列查询指定列查询查询字段为表达式为查询结果指定别名语法⽰例 结果去重查询 Order by 排序…

SpringBoot项目部署到云服务器全流程

文章目录 一、前期准备&#xff08;一&#xff09;云服务器选择&#xff08;二&#xff09;本地环境准备&#xff08;三&#xff09;数据库准备&#xff08;若项目需要&#xff09; 二、服务器配置&#xff08;一&#xff09;获取服务器信息&#xff08;二&#xff09;重置实例…

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

如何用通义灵码助力项目开发 | OceanBase obdiag 项目共建实践

本文来自 obdiag 项目共建的用户分享 一、背景 我的数据库探索之旅始于OceanBase。作为一位满怀好奇心的DBA&#xff0c;我内心始终怀揣着对数据库内部运作机制的无尽向往。开源如同一把钥匙&#xff0c;为我们这些求知欲旺盛的“好奇猫”解锁了通往新知的神秘大门。在众多分布…

网络安全,文明上网(2)加强网络安全意识

前言 在当今这个数据驱动的时代&#xff0c;对网络安全保持高度警觉已经成为每个人的基本要求。 网络安全意识&#xff1a;信息时代的必备防御 网络已经成为我们生活中不可或缺的一部分&#xff0c;信息技术的快速进步使得我们对网络的依赖性日益增强。然而&#xff0c;网络安全…

实时数据研发 | Flink技术栈

下周要开始接触一些实时的内容了&#xff0c;想来是很幸运的&#xff0c;这是我在新人培训上提问过技术前辈的问题&#xff1a;“想学习实时相关技术&#xff0c;但是部门没有类似的需求&#xff0c;应该如何提升&#xff1f;”当时师姐说先用心去学&#xff0c;然后向主管证明…

Spark SQL 之 QueryStage

ExchangeQueryStageExec ExchangeQueryStageExec 分为两种