Python数据结构详解(三)列表与元组
学习一门语言,了解其数据结构是基础。由于Python是动态编程语言,所以在定义变量时并不需要事先指定变量的数据类型,变量的声明和初始化是同时进行的。
Python有如下五大数据结构类型:
1、Number类型
2、字符串类型
3、列表,元组
4、字典
5、集合
下面我们逐一来了解一下
本篇主要介绍列表与元组,是数据结构类型介绍的第三篇。
前两篇关于Number类型和字符串类型的介绍,可以看这里:Python数据结构详解(三)列表与元组。三、列表与元组
之所以将列表与元组放到一起,是因为这两个数据类型很相似,可以将元组理解为只读的列表结构。1。1列表1。1。1列表的表达方式
列表的元素和数量可以是任意的,可能只有几个元素,也可能有成千上万个元素,每个元素的类型可以是相同的,也可以是不同的,列表中区分元素顺序,也允许包含重复元素。
下面来看下如何定义一个列表。纯数字列表number〔1,2,3,1〕纯字符串列表names〔peter,lili,gates〕混合列表person〔peter,1993,{age:30},True〕1。1。2列表的基本操作索引和切片
列表的操作基本都是索引来实现的。
索引编号默认是从0开始的,并且在python中,还支持反向索引,用负数表示:names〔peter,lili,gates〕输出结果:peterprint(names〔0〕)输出结果:liliprint(names〔2〕)超出索引范围,会抛出listindexoutofrange的错误print(names〔3〕)
切片操作可以从列表中根据指定的开始索引与结束索引来获取一个新的子列表,切片有如下几个特点:
(1)切片截取的是左开右闭区间,s〔1:3〕取的是s〔1〕与s〔2〕
(2)结束索引若为0,会获取一个空列表
(3)结束索引在列表中的位置若小于等于开始索引在列表中的位置,也会返回一个空列表
(4)切片默认步长是1,也可以手动指定,但步长不能为0,否则会抛出异常str1〔h,e,l,l,o〕输出结果:〔h,e,l,l〕print(str1〔0:4〕)结束索引为0,输出结果:〔〕print(str1〔4:0〕)输出结果:〔l〕print(str1〔3:1〕)结束索引在列表中的位置小于等于开始索引在列表中的位置,输出结果:(空列表)print(str1〔4:1〕)省略开始索引,表示从0开始,输出结果:〔h,e,l,l〕print(str1〔:4〕)省略结束索引,表示截取到列表结尾,输出结果:〔h,e,l,l,o〕print(str1〔0:〕)省略开始与结束索引,表示复制整个列表,输出结果:〔h,e,l,l,o〕print(str1〔:〕)指定步长为2,输出结果:〔h,l,o〕print(str1〔::2〕)指定反向步长为1,输出结果:〔o,l,l,e,h〕print(str1〔::1〕)列表的加法与乘法
加法操作使用加号()完成,表示把加号两端的列表变量连接形成一个新列表;
乘法操作使用星号()完成,表示对当前列表对象进行复制并连接,并形成一个新列表。str1〔h,e,l,l,o〕str2〔w,o,r,l,d〕str3hellostr4world输出结果:〔h,e,l,l,o,w,o,r,l,d〕print(str1str2)输出结果:〔h,e,l,l,o,h,e,l,l,o〕print(str12)输出结果:helloworldprint(str3str4)输出结果:hellohelloprint(str32)
虽然字符串本质上也是列表,但字符串与列表并不能直接相加str1〔h,e,l,l,o〕str2helloprint(str1str2)
会抛出异常
列表元素的检查(in运算符)
可以使用in运算符检查某个元素是否在列表中,返回TrueFalsestr1〔h,e,l,l,o〕str2hello输出结果:Trueprint(hinstr1)输出结果:Trueprint(heinstr2)列表元素的修改与删除
列表元素的修改是通过索引来实现的。str1〔h,e,l,l,o〕str1〔0〕w替换一个元素,输出结果:〔w,e,l,l,o〕print(str1)str1〔1:〕〔1,2,3,4,5,6〕使用切片方式替换多个元素,输出结果:〔w,1,2,3,4,5,6〕print(str1)
列表的删除很简单,使用del语句即可。str1〔h,e,l,l,o〕delstr1〔0〕输出结果:〔e,l,l,o〕print(str1)delstr1〔3:〕输出结果:〔e,l〕print(str1)1。1。3多维列表
所谓多维列表,就是列表的元素还是列表,列表的元素还是列表
呃还是以二维举例吧example〔〔1,2〕,〔a,b,c〕,〔True,False〕〕输出结果:〔a,b,c〕print(example〔1〕)
上面是最基本的创建二维列表的方式,但有时候二维列表是根据已有的条件来创建。i3j5k〔〔x2forxinrange(i)〕foryinrange(j)〕输出结果:〔〔0,1,4〕,〔0,1,4〕,〔0,1,4〕,〔0,1,4〕,〔0,1,4〕〕print(k)
这边用到了列表解析生成二维列表的方式,现在看不懂没关系,看完下面章节再回头来看这里就明白了。1。1。4列表解析列表解析(或称列表推导)是根据已有列表,高效创建新列表的方式。
列表解析是Python迭代机制的一种应用,常用于创建新的列表。
解析语法:〔exprforvariniterable〕
这个语句的核心是for循环,它迭代iterable对象的所有条目,前边的expr是生成列表元素的表达式。
举个栗子array〔x2forxinrange(1,5)〕输出结果:〔1,4,9,16〕print(array)输出结果:〔2,3,4,6〕print(〔xyforxinrange(1,3)foryinrange(2,4)〕)
1。2元组1。2。1元组的表达方式
元组与列表一样,也是一种列表,唯一不同的是元组不能修改,将元组理解为只读的列表更容易帮助理解。
下面来看下如何定义一个元组。number11,2,3,4输出结果:(1,2,3,4)print(number1)number2(4,5,6,7)输出结果:(4,5,6,7)print(number2)
可以看到,元组是用圆括号()括起来的,并且在定义的时候可以不需要加圆括号。
也可以将元组分配给多个变量。x,y,z(1,2,3)输出结果:123print(x,y,z)i,j1,2输出结果:12print(i,j)
利用这个特性,可以很容易的实现变量交换,而无需中间变量。x,y1,2x,yy,x输出结果:21print(x,y)
上面栗子中,变量的数量与元组中的元素数量是相同的,否则会抛出异常。
问题来了,如果元组中元素很多,比如有100个,难道需要定义100个变量么?
其实不用这么麻烦,只需要将部分元素赋给变量,其余元素转化为子列表即可,上栗子x,y,z(1,2,3,4,5,6,7,8,9)输出结果:12print(x,y)输出结果:〔3,4,5,6,7,8,9〕print(z)
在上面代码中,右侧的元组有9个元素,而左侧只有3个变量,如果按以前的逻辑,执行这行代码肯定是要抛出异常的,但由于z变量前面有一个,这就是通配符,如果放在一个变量前面,表示列表,也就是说,变量z本身就是一个列表。Python解析器首先会按列表中元素的顺序和匹配对应的单个变量,剩下的值都给列表变量,也就是z。所以执行这行代码后,x和y的值分别是1和2,而z的值是〔3,4,5,6,7,8,9〕。
需要注意的是,左侧变量中只能由一个带的变量,否则python解析器无法确定列表的范围。x,y,z(1,2,3,4,5,6,7,8,9)print(x,y,z)
最后,再来看看如何定义只含一个元素的元组。number11输出结果:1print(number1)number2(1)输出结果:1print(number2)number31,输出结果:(1,)print(number3)number4(1,)输出结果:(1,)print(number4)
从上面栗子可以看出,定义一个元素的元组需要在末尾加上逗号,否则就只是一个普通的值,并非元组。1。2。2元组的基本操作访问:元组和列表一样,也是通过索引来访问具体的元素;修改:元组是只读的,不支持元素的修改;删除:元素值不允许删除的,但可使用del语句删除整个元组。
1。3相关函数与方法1。3。1列表与元组常用的函数
函数
含义
len
返回列表元组中元素数量
max
返回列表元组中最大的元素值(每个元素值必须是可比较的,否则抛异常)
min
返回列表元组中最小的元素值(每个元素值必须是可比较的,否则抛异常)
list
元组转换为列表
tuple
列表转换为元组str1〔1,2,3,4,5〕输出结果:5print(len(str1))输出结果:5print(max(str1))输出结果:1print(min(str1))str2〔h,i〕这里比较的是字符的ASCII码,输出结果:iprint(max(str2))还记得之前说过,True会被当作1,输出结果:Trueprint(max(0,True))会抛异常,这俩之间没法比较print(max(1,hello))str3(1,2,3)输出结果:(1,2,3)print(str3)输出结果:〔1,2,3〕print(list(str3))输出结果:(1,2,3)print(tuple(list(str3)))1。3。2列表与元组常用的方法
方法
含义
append
在列表最后插入新元素
clear
清除列表所有内容
copy
复制列表元组
count
用于统计某个元素在列表元组中出现的次数
extend
在列表结尾插入另一个列表,即用来扩展原列表
index
用于从列表元组中找出某个值第一次出现的索引位置
insert
将某个元素插入列表指定位置
pop
移除列表中的元素(默认是最后一个元素),并返回该元素的值
remove
移除列表中某个值的第一个匹配元素
reverse
列表元素反转
sort
列表元素排序classone〔lili,peter,gates〕newguyjackclassone。append(newguy)输出结果:〔lili,peter,gates,jack〕print(classone)newguys(lili,lala,bote)classone。extend(newguys)输出结果:〔lili,peter,gates,jack,lili,lala,bote〕print(classone)拷贝副本classtwoclassone。copy()指向同一个列表classthreeclassoneclassone〔0〕lala修改classone中的值,classtwo不会改变输出结果:〔lili,peter,gates,jack,lili,lala,bote〕print(classtwo)修改classone中的值,classthree会随着改变输出结果:〔lala,peter,gates,jack,lili,lala,bote〕print(classthree)输出结果:2print(classtwo。count(lili))输出结果:0print(classtwo。index(lili))classone。reverse()输出结果:〔bote,lala,lili,jack,gates,peter,lala〕print(classone)classone。sort()输出结果:〔bote,gates,jack,lala,lala,lili,peter〕print(classone)classone。clear()输出结果:〔〕print(classone)
1。4列表与元组的差异
总结一下列表与元组的差异点:可变性:列表是可变的(Mutable),也就是说,它们的元素可以通过索引进行修改、删除或添加,而元组是不可变的(Immutable),一旦创建就不能被修改。语法:列表用方括号(〔〕)来表示,元素之间用逗号(,)分隔,而元组用圆括号(())来表示,元素之间也用逗号(,)分隔。如果元组只有一个元素,则需要在元素后面加上一个逗号。使用场景:一般来说,当我们需要在程序中存储一些可以被修改的数据时,应该使用列表。而当我们需要在程序中存储一些不可修改的数据时,应该使用元组。性能:由于元组是不可变的,因此在一些情况下它们比列表更快,尤其是当元组作为字典的键时。内存:一般来说,创建元组类型tuple的变量比列表类型list要快,而且占用更小的存储空间。线程安全:元组类型变量的元素不可更改性,可保证多线程读写时的安全问题。
下篇开始介绍字典,如果觉得小编写的不错的话,麻烦给个关注,点赞、转发
更多的Python学习资料,可以到python资料获取,持续不间断地免费更新Python资料
编程头条创作挑战赛
12款辣椒酱对比老干妈7成是油没吃过这1款,不要说自己能吃辣有人喜欢特辣,也有人喜欢微辣,面对不同的辣度,我们如何挑选一款适合自己的辣椒酱?香喷喷的辣椒酱特别下饭,一吃就是好几勺。但是,你有没想过每吃一勺的辣椒酱,你可能会吃下多少的油和盐?
中国2款放心酒,经鉴定是100纯酿,好喝不贵,你喝过几个?如果问安全感是什么?肯定很多人回答钱!毕竟一分价钱一分货,在白酒圈,大家都认为价格越贵的酒越好,比如茅台,甚至更高价格的酒,而那些便宜到十几二十块钱的酒,只能是差酒。这种固有思想,
明日中秋,建议大家别太心疼钱,多吃4种海鲜,团圆喜庆过中秋金秋佳节话家常皓月当空人团圆,花好月圆人长久,中秋节是中华民族的传统佳节,正处于一年之中气温最适宜,各种食材争先上市的金秋时节,因此中秋节是一个感恩和团圆喜庆的节日。中秋节家人欢聚
澳洲第三大城市布里斯班市区掠影布里斯班(Brisbane)是澳大利亚昆士兰州首府,也是第三大城市,仅次于悉尼和墨尔本,是个美丽的滨海城市。我们一大早从墨尔本出发,经过一小时左右的飞行抵达布里斯班。从飞机上往下看
一线警察海拔4900米边境,一个小派出所守护一个民族70年来源北京日报客户端朋友,你去过独龙江吗?你走过由无数个之字形组成的独龙江公路吗?你闻过4900米高山上草果的芳香吗?你喝过独龙纹面女酿造的美酒吗?是的,这是独龙江的美景。但是还有比
诗意中国平分秋色一轮满,长伴云衢千里明原标题新华全媒丨诗意中国平分秋色一轮满,长伴云衢千里明9月10日在江苏苏州拍摄的圆月。新华社发(杭兴微摄)当日是农历八月十五中秋节,人们同赏明月,共度佳节。9月10日晚在江苏省南京
麻栗坡有个植物资源宝库这个是黄精,这叫树萝卜,这是石斛在麻栗坡天保镇的老山药王谷中,麻栗坡友缘农业专业合作社理事长韦堂友走在药王谷植物长廊中,边指着眼前额植物边介绍着。郁郁葱葱的植物交织生长,枝连着叶,
最美的风景打开眼界每个人的心中都有个梦想,想探索我们生存的地球。也许你想足不出户就能领略到名山大川,也许你想毫不费力就能了解到芸芸众生,地球上那么多令人惊叹的神奇存在,激起了我们内心深处旺盛
广东梅州八乡山,客家世界的香格里拉,独特风景无不撩人心弦头条创作挑战赛鸿图嶂山顶大峡谷栈道大峡谷利用周末,到八乡山一天游,上午登鸿图嶂,下午徒步八乡山大峡谷。杜鹃花怪石嶙峋瀑布初夏一个周末早上,开车沿着盘山公路,来到丰顺县八乡山镇和五华
贵州600年古城,花32亿打造黔中江南水乡,500米老街重现荣光你能想象得到吗?一条看似破旧不堪的老街,竟然走出了1个武举人4位将军3名中央委员。还有100多座四合院众多名人公馆,以及一众安顺地道美食,都聚集于此。2013年,这条名为儒林路的老
海口文明已成市民出行标配图海口网9月11日消息(记者韩俊元摄影报道)肥嘟嘟的大熊貓正吃着竹笋,气势十足的东北虎在草丛中踱来踱去这个中秋小长假,不少海口市民选择带着孩子到海南热带野生动植物园打卡。让人感到欣慰