技术标签: 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
oracle sql developer 启动选择java.exe路径 设置错误了,如何重新设置??你的安装目录下的子目录: \sqldeveloper\bin 有一个文件: sqldeveloper.conf 其中有:SetJavaHome xxx 将其修改为正确的jdk路径即可。
使用stm32CubeMX完成一个STM32的USART串口通讯程序,并利用keil逻辑分析仪进行仿真查看波形
iOS模拟器中图片在mac电脑中的实际位置 位置:/Users/hyf/Library/Developer/CoreSimulator/Devices/CE85A44B-79C7-497D-A020-90943F0B2C17/data/Media/DCIM/100APPLE其中:hyf 是登陆mac的用户名称CE85A44B-79C7-497D-A020-90943F0B2
d3.js学习笔记-01目录d3.js学习笔记-011. 基础概念1.1 D3的优势:1.2 D3的适用范围:1.3 D3学习网站2. 关键知识2.1 SVG定义2.2 SVG图形元素矩形:``圆形:``椭圆:``线段:``多边形 or 折线:` or `路径:``2.3 SVG文字2.4 SVG常用样式2.4 SVG标记(marker)2.3 SVG滤镜与渐变(省略)References1. 基础概念D3全称为Data-Driven Documents(数据驱动文档),是一个JavaScript函
java 根据类名示例化类 LocalDateTime类isBefore()方法 (LocalDateTime Class isBefore() method)isBefore() method is available in java.time package. isBefore()方法在java.time包中可用。 isBefore() method is used to check w...
Pytorch已经可以自动回收我们不用的显存,类似于python的引用机制,当某一内存内的数据不再有任何变量引用时,这部分的内存便会被释放。但有一点需要注意,当我们有一部分显存不再使用的时候,这部分释放的显存通过Nvidia-smi命令是看不到的,举个例子:device = torch.device('cuda:0')# 定义两个tensordummy_tensor_4 = torch.randn(120, 3, 512, 512).float().to(device) # 120*3*512*
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到,所以如果你不懂对你是损失很大的。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出(Last-In/First-Out)堆堆:什么是堆?又该怎么理解呢?①堆通常是一个可以被看做一棵树的数...
自定义导航栏的按钮,文字
1.OS的作用是什么?1.操作系统作为用户与硬件系统之间的接口。2.操作系统作为资源的管理者。3.操作系统实现了对资源的抽象。2.单道批处理是什么概念,解决了什么问题,是如何解决的?还存在什么问题?1.单道批处理是计算机系统对一批作业(但在内存中仅有一道作业)自动进行处理。2.解决了人机矛盾和CPU与I/O设备速度不匹配矛盾。3.通过提高系统资源的利用率和系统吞吐量。4.不能充分利用系统资源。3.多道批处理是什么概念,解决了什么问题,是如何解决的?1.在内存中同时存放多道相互独立程序,按
三部排序题目描述思路分析题目描述一般的排序有许多经典算法,如快速排序、希尔排序等。但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。比如,对一个整型数组中的数字进行分类排序:使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!以下的程序实现了该目标。其中x指向待排序的整型数组,len是数组的长度。void sort3p(int* x, int le
最近买了个STM32 的开发版, 又顺便配了一个ST Link v2 的硬件调试仿真器.在Keil MDK 中调试,总是在汇编语言里面的3条语句里面循环. 不会进入到main函数. main函数一次都不执行.单步暂停的时候程序确实会停止, (LED停止闪烁). 但是刷入的程序好像是上次的.起初以为是买了假的ST/Link 导致的. 后来用了开发版官方的测试程序烧写进去调试了一下,竟然可以调试
当使用 Dockerfile 进行构建镜像时,有时会需要设置容器内的环境变量。ENV 指令的格式如下:ENV <key>=<value> ...ENV 指令将环境变量 <key> 设置为值 <value>。这个值将在构建阶段的所有后续指令的环境中,也可以被替换使用在其他指令中。该值将被解释为其他环境变量,因此如果引号字符没有转义,它们将被删除。像命令行解析一样,引号和反斜杠可以用于在值中包含空格。例如:ENV MY_NAME="John Do.