python中数组类型有哪些_理解Python中的数组类型 - list_weixin_39743423的博客-程序员秘密

技术标签: 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

智能推荐

python -day06初始面向对象_afd2828的博客-程序员秘密

楔子你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢?你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色def person(name,age,sex,job...

安装Jdeveloper 12C_HezhezhiyuLe的博客-程序员秘密

Caused by: java.lang.Exception: oracle.sysman.oii.oiif.oiifb.OiifbEndIterateException: java.io.FileNotFoundException: C:\Users\19686\Documents\oracle12c\oui\lib\win64\msvcrt.dll (拒绝访问。)

机器学习-朴素贝叶斯-垃圾邮件_weixin_54881329的博客-程序员秘密

属于监督学习的生成模型,实现简单,并有坚实的数学理论(即贝叶斯定理)作为支撑。分类标准:当 P(垃圾邮件|文字内容)> P(正常邮件|文字内容)时,我们认为该邮件为垃圾邮件,但是单凭单个词而做出判断误差肯定相当大,因此我们可以将所有的词一起进行联合判断。3:结果展示(结果为:数据集中有训练集和测试集,所以当我们对训练结果进行测试时,可以发现测试结果很高为98%,所以可以实现大部分的垃圾邮件的检索。2:理解:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。

MapReduce实战:统计手机号耗费的总上行流量和下行流量_数据包流量中上行、下行_Movle的博客-程序员秘密

1.需求:统计每一个手机号耗费的总上行流量、下行流量、总流量2.数据准备:输入数据格式:时间戳、电话号码、基站的物理地址、访问网址的ip、网站域名、数据包、接包数、上行/传流量、下行/载流量、响应码最终输出的数据格式:手机号码 上行流量 下行流量 总流量3.分析:基本思路:(1)Map阶段:(a)读取一行数据,切分字段(b)抽取手机号、上行流量...

Linux掌握Vim编辑器、Shell脚本的使用_shell脚本里使用vim编辑文件_司空良的博客-程序员秘密

一、实验目的与要求掌握使用Vim编辑器来编写、修改文档,掌握Vim编辑器的各种指令操作,掌握Shell脚本,学会编写Shell脚本。二、实验内容1. 执行命令vi进入vim编辑器,打开一个新文件。3. 字符编辑操作:移动光标、字符删除与行删除、字符复制与行复制、粘贴、查找字符串。4. 按键进入命令模式。 三、实验环境Windows操作系统下的虚拟机Linux操作系统。四、实验过程记录1. 执行命令vi进入vim编辑器,打开一个新文件。2.输入a、i、o中的任一字符进入插入模式。 3. 字符...

python面试_PresleyR的博客-程序员秘密

目录Python基础篇1:为什么学习Python2:通过什么途径学习Python3:谈谈对Python和其他语言的区别Python的优势:4:简述解释型和编译型编程语言5:Python的解释器种类以及相关特点?6:位和字节的关系7:b、B、KB、MB、GB的关系8:PE8规范9:通过代码实现如下转换(进制之间转换)10:...

随便推点

python从入门到精通 pdf 完整超清版-Python从入门到精通PDF高清完整版免费下载|百度云盘..._编程大乐趣的博客-程序员秘密

提取码:xahb内容简介《Python从入门到精通》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Python进行程序开发应该掌握的各方面技术。全书共分22章,包括初识Python、Python语言基础、运算符与表达式、流程控制语句、列表与元组、字典与集合、字符串、Python中使用正则表达式、函数、面向对象程序设计、模块、异常处理及程序调试、文件及目录操作、操作数据库、GU...

Java中final修饰符的理解_java final修饰类_荒夜长歌的博客-程序员秘密

记录一下今天复习的final修饰符,其中 final类的成员方法隐式被final修饰部分 仅代表我个人理解总结如下:final有三种使用方法:1、final修饰类 final修饰类表示这个类不能被继承, 这个类的成员变量可以选择性得用final修饰, 类的成员方法在继承角度来说可以理解为默认被final修饰, 因为java之前是可以用final使方法变为内嵌调用,以此来提高方法效率;2、final修饰方法 final修饰方法表示这个方法被锁定,不能被任何类修改, 当一个方法被private修

html-Canvas-1.1_"grd.addcolorstop(0,\"#ff0000\");"_彩舒的博客-程序员秘密

创建画布要想让咱们的东西展示出来,那肯定要有个画布哦,就是咱们作画的地方哦。那我们就要创建canvas画布。<canvas id="myCanvas" width="200" height="250" style="border:1px solid #c3c3c3;"></canvas>这里有东西需要咱们注意一下哦,width height,咱们可以直接写在c

如何在Linux上部署Kettle?你不想知道吗?_linux部署kettle_weixin_43563705的博客-程序员秘密

说两句:希望大家能坚持有计划的学习,在文章的末尾可以扫码进群讨论,另外有福利等着大家送给大家一句话今日事,今日毕KETTLELinux安装KettlePan——转换执行引擎Kitchen——作业执行引擎小结Linux安装Kettle用File Zilla将kettle上传到Linux服务器,并解压缩在命令行执行./pan.sh -version./kitchen.sh -version如果能够看到以下输出,表示kettle可以正确运行2019/10/09 08:49:.

Paxos与ZAB、Raft对比_Lidisam的博客-程序员秘密

什么是Raft?Raft一种用来管理日志复制的一致性算法分为三个角色:leader(集群主节点)、follower(跟随节点)、candidate(无leader情况下会有follower升级为这个)升级顺序:follower->candidate->leader (不能跨级别晋升)选举过程:- 服务刚启动全部都是follower角色,并经过一段时间才会有follower成为candidate(避免出现多个candidate分散选票),另外raft会把日志写入...

mysql group by/having/distinct 查询使用例子_lingzhm的博客-程序员秘密

表的内容如下://查询单分数最高的人IDselect stuid,max(score) from stu_select_class;// 查询各科总分2-3名的学生select stuid, sum(score) from stu_select_class group by stuid  limit 1,2;//查询每科的最高分学生select clas

推荐文章

热门文章

相关标签