列表介绍
Pythonlist(列表),是Python中最常用的一种数据结构,我们也称作列表类型。它是一组用方括号括起来、逗号分隔的数据。
数据可以是任意类型的,里面的数据也可以重复。虽然说可以任意类型,但是在开发的时候我们都是使用相同的类型。
格式是这样的:
list1=[元素1、元素2、元素3、......]如:heros=[孙膑,百里守约,墨子]
我们可以在编译器中定义一下并且查看数据类型的表示:
heros=[孙膑,百里守约,墨子]print(type(heros))
可以看到打印的结果是:classlist,所以以后只要看到列表就是list。但是大家要注意元素与元素之间使用逗号隔开,逗号必须是英文输入法下的逗号哟!
比如让大家创建一个列表保存:探险家、河流之王、荒漠屠夫、齐天大圣、冰晶凤凰、赛恩,你如何定义呢?
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]print(heros)
我们可以看到打印结果:
[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]
列表的索引与切片
索引
列表跟字符串一样,里面的元素就像一个个士兵站好的队伍一样,站队的时候他们都会报数。
从头到尾每个士兵都会报一个递增的数字,在我们列表这里也是如此的,报数的数字就是对应元素的索引(index),但是与我们生活中不同的是,列表第一元素的索引是0。
比如:
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]#打印:荒漠屠夫,下标从0开始则荒漠屠夫就是2print(heros[2])#打印:冰晶凤凰,对应的下标是4print(heros[4])#打印:赛恩,对应的下标是5print(heros[5])
打印结果:
荒漠屠夫冰晶凤凰赛恩
打印的内容就是我们想要的。
但是发现打印到的时候,我们数到那里太费劲了。
字符串中是支持负数下标的,列表是否支持?同样也是-1开始,并且是从右向左的。
可以使用heros[-1]打印一下。
事实上结果是完全没有问题的,索引的使用和字符串是一模一样的。即:
列表:[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]
正索引:负索引:-6-5-4-3-2-1
切片
通过索引,我们可以访问list(列表)的单个元素。但有时候我们要取列表的一个片段,这就是“切片”操作。切片返回的是一个列表,可以理解为“子列表”。
切片是通过索引来实现的,比如:heros[1:3],这里索引变成两个用冒号:分隔,分别是切片的开始索引和结束索引,[1:3]代表的是一个左闭右开的区间,即包含左边索引的元素,到右边索引为止但不包括该元素。那么heros[1:3]得到的是[河流之王,荒漠屠夫]:
切片还有更加高级的用法就是控制步长和方向。格式:
列表名[start:end:step]start和end是左闭右开的区间,step表示的是步长,并且步长可以是正向(从左向右)也可以是逆向(从右向左)取元素。step如果是负数表示的是逆向,如果是正数表示的是正向如果end省略则表示到列表最后一个元素,如果start省略表示从第一个元素开始
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]#打印:河流之王,荒漠屠夫,齐天大圣print(heros[1:4])#打印:河流之王,齐天大圣,赛恩,print(heros[1::2])#打印:赛恩,冰晶凤凰,齐天大圣print(heros[-1:2:-1])#打印:冰晶凤凰,河流之王print(heros[-2::-3])
打印结果:
[河流之王,荒漠屠夫,齐天大圣][河流之王,齐天大圣,赛恩][赛恩,冰晶凤凰,齐天大圣][冰晶凤凰,河流之王]
如果想得到:荒漠屠夫和赛恩呢?怎么写?
list运算符与遍历
列表作为Python的一种“内置类型”,它也像基本类型数字、字符串那样可以进行一些运算符的运算,如下表所示:
从头到尾遍历(迭代)一个list的语法是:forxinlist:
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]forhinheros:print(h)
结果是列表中的元素换行打印出来。
如果想获取list列表的长度,也是使用len()这个内置函数。
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]print(len(heros))#长度为6
list的常用操作
list列表中的元素还会经常涉及到变动,比如士兵站队,迟到的士兵默认要站在末尾,还有可能趁班长没有看到偷偷插队的士兵,甚至有内急偷偷离开的士兵。这跟我们列表元素中的增删改查很类似。
增加元素
比如我们有:heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩],又来了一位英雄:牛头酋长。我们怎么把他加进来呢?
在list中有:
list.append(obj):在列表末尾添加新的对象list.extend(seq):在列表末尾一次性追加另一个序列中的多个值
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]#使用append添加元素heros.append(牛头酋长)print(heros)#有一个新的heros列表new_heros=[希维尔,崔斯特]#将new_heros添加到heros中heros.extend(new_heros)print(heros)
打印结果是什么呢?
[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩,牛头酋长][探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩,牛头酋长,希维尔,崔斯特]
删除元素
增加元素成功,但是我们如果又有想法想删除一个英雄人物呢?比如现在不喜欢:河流之王了,要将其删除掉。
删除的方式有多种:
dellist[索引]表示删除指定索引位置的元素list.pop([index=-1])移除列表中的一个元素(默认最后一个元素),并返回该元素的值,当然也可以索引值,表示删除指定索引位置的元素跟dellist[索引]类似,但是这个pop有返回值,即被删除的元素list.remove(obj)移除列表中某个值的第一个匹配项,没有返回值
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩,冰晶凤凰]#删除下标为1的元素delheros[1]print(heros)#删除下标为1的元素,并获取返回值element=heros.pop(1)print(heros)print(element)#删除:冰晶凤凰element=heros.remove(冰晶凤凰)print(heros)print(element)#注意这句话会报错的,ValueError:list.remove(x):xnotinlistelement=heros.remove(冰晶凤凰1)print(heros)
结果:
[探险家,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩,冰晶凤凰][探险家,齐天大圣,冰晶凤凰,赛恩,冰晶凤凰]荒漠屠夫[探险家,齐天大圣,赛恩,冰晶凤凰]None
可以看到remove的返回值是None,而且是只删除了从左向右的第一个遇到的元素,后面的没有删除。而且如果要删除的元素不在列表中存在则会报异常:ValueError。
修改元素
所谓修改元素就是修改指定位置的元素。比如heros[0]是探险家,现在想换成其他的英雄。
方式有两种:
直接使用list[索引]进行替换使用insert(元素名)
我们通过代码观察一下区别:
heros=[探险家,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩]#使用列表方式替换原有元素heros[0]=希维尔print(heros)heros[-1]=牛头酋长print(heros)#使用insert指定索引位置替换heros.insert(3,崔斯特)print(heros)
结果如下:
[希维尔,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩][希维尔,河流之王,荒漠屠夫,齐天大圣,冰晶凤凰,牛头酋长][希维尔,河流之王,荒漠屠夫,崔斯特,齐天大圣,冰晶凤凰,牛头酋长]
通过结果我们分析出,heros[0]=希维尔是替换了原来的元素:探险家,而heros.insert(3,崔斯特)则是占用了索引3的位置,原来此位置的被挤到后面了。
查询元素
所谓查询元素,就是判断列表中是否存在要查找的元素。那我们使用什么完成这个任务呢?严格来说是三种方式:
list.index(obj)从列表中找出某个值第一个匹配项的索引位置list.count(obj)统计某个元素在列表中出现的次数objinlist其实这个在前面说过,但是也可以用于判断
我们通过代码来看一下
heros=[探险家,河流之王,冰晶凤凰,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩,冰晶凤凰]#判断荒漠屠夫是否在列表中存在n=heros.index(荒漠屠夫)print(n)#判断牛头酋长是否在列表中存在#n=heros.index(牛头酋长)#print(n)#也可以使用count判断个数n=heros.count(冰晶凤凰)print(n)#当然也可以使用:荒漠屠夫inherosprint(荒漠屠夫inheros)
运行结果看一下(注意把查找牛头酋长的注释掉了,为什么要注释呢?)
33True
注释的原因是:如果查找的元素不在列表中,会报错的,ValueError:牛头酋长isnotinlist。
其他操作
列表除了这些操作之外还有排序、倒序等方法可以使用。
list.reverse()反向列表中的元素list.sort(cmp=None,key=None,reverse=False)对原列表进行排序
代码展示一下:
heros=[探险家,河流之王,冰晶凤凰,荒漠屠夫,齐天大圣,冰晶凤凰,赛恩,冰晶凤凰]#倒序列表中的元素heros.reverse()print(heros)#对列表中的元素进行排序heros.sort()print(heros)#对列表中的元素进行排序,也可以降序heros.sort(reverse=True)print(heros)
结果:
[冰晶凤凰,赛恩,冰晶凤凰,齐天大圣,荒漠屠夫,冰晶凤凰,河流之王,探险家][冰晶凤凰,冰晶凤凰,冰晶凤凰,探险家,河流之王,荒漠屠夫,赛恩,齐天大圣][齐天大圣,赛恩,荒漠屠夫,河流之王,探险家,冰晶凤凰,冰晶凤凰,冰晶凤凰]
怎么样?有了列表的操作之后,我们在操作一组数据的时候是不是变得很方便了。