python中数组类型有哪些_理解Python中的数组类型 - list-程序员宅基地

技术标签: python中数组类型有哪些  

这一节,我们来讨论Python中数组类型:list。不过,我们的重点并不是一一过一遍每一个API的用法,这并没有太多意义。如果大家有过一些开发经验,理解这些API并没有什么困难。

我们要做的,仅仅是快速让大家熟悉list在Python中的表达方式,以及Python特有的地方。剩下的工作,就可以在实际的开发中,用到哪学到哪了。

创建List

先来看如何创建list,和强类型语言不同,我们无须指定数组中存储的具体数据类型,例如:

定义空list的时候,无须指定list中元素的类型:

list1 = []

list2 = list()

同一个list中既可以存储相同类型的值,也可以存储不同类型的值:

numList = [8, 6, 5, 7, 2]

mixList = [1, "one", 1.0]

甚至,我们可以把类型和元素个数都不同的两个list添加到list中:

nestedList = [numList, mixList]

这样,就定义了一个嵌套的list对象。

List常用操作

接下来,我们看一些list的常用操作。

合并Lists

首先,是合并多个list,我们有两种不同的方式。第一种,和字符串的合并是类似的,直接把要合并的list对象相加就好了:

print(mixList + numList)

# [1, 'one', 1.0, 8, 6, 5, 7, 2]

第二种,是直接修改对象本身,在其尾部追加一个list:

print(mixList.extend(numList))

# None

print(mixList)

# [1, 'one', 1.0, 8, 6, 5, 7, 2]

从上面的注释中可以看到,extend的返回值是None,它只会把numList中的值,直接添加到mixList尾部。因此,当我们再查看mixList的时候,就可以看到追加的结果了。

extend和append方法的区别

实际上,除了extend之外,我们还有一种给list追加元素的方法,叫append,和extend不同的是,无论我们传递给它什么,它都会直接插在list末尾,无论是单个元素,还是另外一个list。例如:

numList.append(9)

print(numList)

# [8, 6, 5, 7, 2, 9]

从注释就可以看到,append直接把数字9添加到了numList末尾。或者,我们也可以像下面这样直接塞一个list:

numList.append([9, 10])

print(numList)

# [8, 6, 5, 7, 2, [9, 10]]

这时,就会看到numList的最后一个元素,就是一个list对象,append会把它的参数当作一个整体,添加到numList末尾。

看到这里,你可能会想一个问题,该如何在extend和append之间选择呢?其实,从它们各自的行为,我们就已经有了实践的标准:

append是O(1)算法,当我们要把list作为一个整体添加到list中时,使用append是更快的做法,不要遍历list之后,反复调用append插入单个元素;

extend是O(n)算法,但是它是通过C实现的,当要把一个list中的元素逐个添加到另外一个list中时,总是应该选择extend,无论是写起来还是执行起来,它的效率都比append版本高很多;

排序list中的元素

其次,是对list中的所有元素排序。这个方法和extend一样,也没有返回值,而是直接在原对象上生效的:

numList = [8, 6, 5, 7, 2]

numList.sort()

print(numList)

# [2, 5, 6, 7, 8]

这里,多说一句,list作为一个类对象,是个引用类型,因此,要想保留sort,extend或append之前的值,单纯的把它赋值给另一个变量是不行的:

numList1 = numList

numList.sort()

print(numList)

print(numList1)

在调用sort之后,numList和numList1的值都会变成[2, 5, 6, 7, 8]。这里,我们必须使用deep copy的做法,明确调用list的copy方法:

numList1 = numList.copy()

这样,对numList的操作就不会影响到numList1了。

访问list中的元素

第三,是访问数组中的元素,和字符串相同,list也支持单索引和range索引访问:

print(numList[0]) # 2

print(numList[0:3]) # [2, 5, 6]

并且,在Python中,range也可以是负数,-1表示list的最后一个元素,-2表示倒数第二个,以此类推。因此,对numList[0:3]来说,也可以这样:

print(numList[0:-2]) # [2, 5, 6]

插入元素

第四,是在list的特定位置,插入元素,为此,使用insert方法就好,显而易见,这也是个直接对原对象生效的方法:

numList.insert(1, 9)

print(numList)

# [8, 9, 6, 5, 7, 2]

insert的第一个参数是要插入的位置,第二个参数是要插入的值。要说明一点的是,如果你使用的位置超过了list的最大长度,insert就会把元素插在list末尾。例如:

numList.insert(100, 9)

print(numList)

# [8, 6, 5, 7, 2,9]

删除元素 - 理解del和pop的差异

第五,来看如何从list中删除元素,常用的方法有三种:

第一种,是使用pop方法,它删除并返回指定位置的元素,如果位置超出list范围会发生运行时错误:

numList = [8, 9, 6, 5, 7, 2]

print(numList.pop(0))

# 8

print(numList)

# [9, 6, 5, 7, 2]

第二种,是使用remove方法,它直接删除list中第一个和参数值相等的元素,并且,没有返回值。如果list中不存在要删除的元素,会导致运行时错误:

numList = [8, 6, 5, 7, 2]

print(numList.remove(2))

print(numList)

# [8, 6, 5, 7]

第三种,是使用全局的del函数,我们直接来看代码:

numList = [8, 6, 5, 7, 2]

del(numList[0:5:2])

print(numList)

# [6, 7]

这里,传给del方法的,是一个list的切片,它既可以是形如numList[0]这样的单个元素,也可以是numList[0:5]这样的range,还可以是指定步进值的range numList[0:5:2]。

在我们的例子里,表示从位置0开始,每两个元素删掉一个,一直到位置5。因此,执行之后,结果就是[6, 7]了。

常用的其它方法

最后,是一些常用的辅助方法:例如,获取数组元素个数,这个用法带有浓浓的C的味道,我们要使用全局len函数:

print(len(numList)) # 5

要查询某个元素是否在list里,可以使用index方法,它会返回元素在数组中的位置。要注意的是,如果查询的元素不存在,会发生运行时错误。但现在不用在意这个问题,稍后,我们会专门提到错误处理方法:

print(numList.index(2)) # 0

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39743423/article/details/111457376

智能推荐

php 判断空数组-程序员宅基地

文章浏览阅读196次。可以使用 empty() 函数来判断一个数组是否为空,如下所示:if(empty($array)){ // $array 为空}else{ // $array 不为空}也可以使用count()函数if(count($array)==0){ // $array 为空}else{ // $array 不为空}还可以使用 == 比较运算符来判断数组是否..._php判断数组是否为空

基于Smith预估器补偿系统控制延迟和传感器延迟(附Matlab实现)_smith补偿-程序员宅基地

文章浏览阅读1.4w次,点赞21次,收藏132次。目录前言Smith 预估补偿原理Matlab实现总结参考文献前言实际设计控制器时,不可避免会有延迟,包括控制延迟和传感器延迟,当延迟比较大时,可能会造成控制器失稳。因此在控制器设计时,需要考虑延迟的影响。这个问题在网络控制系统(Networked Control system)尤为普遍,相应的解决方法也有很多。文章采用一个简单经典的解决办法——Smith预估补偿,先介绍原理,再在Simulink中实现Smith 预估补偿原理一个典型的控制环节如图1所示,图1: 典型控制系统系统延迟包括控制延迟_smith补偿

关于php缓存技术一些见解-程序员宅基地

文章浏览阅读54次。参考的网站【很重要】①、模拟高并发:https://blog.csdn.net/yxwb1253587469/article/details/50572927https://blog.csdn.net/lcrxxoo/article/details/76070264②、数据库与缓存双写不一致问题分析与解决方案设计https://blog.csdn.net/sun_qian..._php 部分人走缓存 部分人不走缓存是什么鬼

用rapid库进行xml文件的 读写_rapidxml 大文件-程序员宅基地

文章浏览阅读277次。 rapid库一共提供四个文件 分别为:rapidxml.hpp rapidxml_iterators.hpp rapidxml_print.hpp rapidxml_utils.hpp四个文件。我们先进行简单测试 :#include "stdlib.h"#include <iostream>//下面三个文件是本段代码需要的库文件#include "rapidx..._rapidxml 大文件

3D模型文件(STL格式)Python读取并解析体积、长、宽、高信息_python读取stp3d文件体积-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏24次。使用Python对stl文件的处理依赖Python的 numpy 和 numpy-stl 模块。下面是一段代码,用于计算stl文件中模型的体积、长、宽、高等信息。import osimport numpy as npfrom stl import meshyour_mesh = mesh.Mesh.from_file('dog.stl')volume, cog, inertia = your_mesh.get_mass_properties()xyz = (your_mesh.max_ - _python读取stp3d文件体积

oracle超出游标最大数量问题解决办法_oracle 超出打开游标的最大数-程序员宅基地

文章浏览阅读5.6k次。在进行批量处理数据时,突然报错说:oracle超出游标最大处理数量,因为没碰到这种情况,所以百度了一下。大概说了两种情况:1、更改oracle数据库游标值(不推荐),游标值给一个小值就可以满足需求使用,所以不需要去更改游标值2、之所以会超出游标值,其原因大概是因为在进行批量处理数据时,因为要频繁访问数据库,我们在连接时相当于是连接一次就相当于在数据库中打开一个游标,数据量大时,游标一直处于频繁打开没有关闭的情况,就会报错超出游标最大数量。此时我们正确的做法就是在循环内部加入关闭连接的操作,意义就相当于_oracle 超出打开游标的最大数

随便推点

html生成pdf文件 wkhtmltopdf使用记录(放弃使用了,现在使用puppeteer)_wkhtmltopdf(html, options).pipe(fs.createwritestre-程序员宅基地

文章浏览阅读2k次。html生成pdf文件说明如何使用遇到但问题 - - 很蠢说明后台功能需要打印一些审批表单,找来找去找到了强大的wkhtmltopdf,wkhtmltopdf在npm中介绍但很详细,如果没有特殊要求使用起来也没什么难度。但在使用过程中犯了一个很蠢但问题,所以记录下来。如何使用wkhtmltopdf-npm安装wkhtmltopdf命令行工具。下载地址安装模块npm install ..._wkhtmltopdf(html, options).pipe(fs.createwritestream('tmp/out.pdf'));

GO语言学习笔记(一) - Go安装配置_go语言提示 create directory indexserver at c:/users/ad-程序员宅基地

文章浏览阅读128次。GO语言学习笔记(一) - Go安装配置下载安装官方网址:https://golang.org/dl/注:国内是被墙的,需要翻墙下载Windows安装Windows下直接运行安装包默认安装在 C:Go 目录下安装完成后执行下面的命令,能正常执行,则安装完成。go version配置GOPATH(Windows)Windows下设置环境变量添加环境变量GOPAT..._go语言提示 create directory indexserver at c:/users/administrator/sdk/go1.20

基于springboot车辆充电桩设计与实现的源码+文档_充电桩预警分析系统 源代码-程序员宅基地

文章浏览阅读1.4k次。随着信息化时代的到来,管理系统都趋向于智能化、系统化,车辆充电桩管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而车辆充电桩管理系统能很好地解决这一问题,轻松应对车辆充电桩平时的工作,既能提高人力物力财力,又能加快工作的效率,取代人工管理是必然趋势。本系统主要包括首页、个人中心、维修员管理、用户管理、电桩类别管理、充电桩管理、充电桩报修管理、维修回复管理、系统管理等功能,通过这些功能的实现基本能够满足日常车辆充电桩管理的操作。_充电桩预警分析系统 源代码

初中级前端面试题—完整版_前端中级面试题-程序员宅基地

文章浏览阅读6.7k次,点赞20次,收藏86次。前言从前端学习到找一份合适的工作,大大小小的面试必不可少,所以我对初级前端面试题进行了初步整理,也方便自己查阅,也希望对小伙伴们有所帮助!HTMLHTML语义化HTML语义化就是让页面内容结构化,它有如下优点1、易于用户阅读,样式丢失的时候能让页面呈现清晰的结构。2、有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重。3、方便其他设备解析,如盲人阅读器根据语义渲染网页4..._前端中级面试题

(十一)Hive数据仓库的使用_hive --service metastore &-程序员宅基地

文章浏览阅读3k次。目录一、目的及要求:目的:要求:二、环境要求:所需环境:集群规划:三、详细步骤:步骤一:启动步骤二:数据仓库的使用1、查看表信息2、hive常用命令3、Hive的数据模型_内部表;4、Hive的数据模型_分区表5、Hive的数据模型_外部表6、Hive的数据模型_桶表7、Hive的数据模型_视图四、总结一、目的及要求:目的..._hive --service metastore &

自动化运维平台Spug介绍-程序员宅基地

文章浏览阅读2.1w次,点赞25次,收藏148次。一、概要Spug是一款使用Python+Flask+Vue+Element组件开发的开源运维管理系统,系统前后端分离,项目创建于2017年,2018 年 2 月第一个开源运维平台版本发布,设计为面向中小型企业设计的轻量级无Agent的自动化运维平台,UI基于Ant Design设计,整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能,且二次开发很方便。它采用授权协议AGPL-3.0,使用开发语言Python JavaScript;软件采用无 Agen_spug