Python:列表(list)
一:作用
二:定义
三:类型转换
四:内置方法
一:列表类型的作用
如果需存多个值并按顺序取,那用list再合适不过了
二:列表类型的定义
l = [1,2,3,'a'] ##相当于l = list(1,2,3,'a') print(l)
print(type(l))
以上代码执行结果为:
[1, 2, 3, 'a'] <class 'list'>
三:列表的类型转换
所有能被for循环遍历的数据类型都可以用list转换为列表
比如字符串:
hee = 'hello' print(hee) print(type(hee)) llo = list(hee) print(llo) print(type(llo))
以上代码执行结果为:
hello <class 'str'> ['h', 'e', 'l', 'l', 'o'] <class 'list'>
list在这里起到的作用跟for循环是一样的,相当于进行了如下操作:
nam = [] #定义一个空列表 ee = 'hello' for i in ee: #遍历字符串ee nam.append(i) #使用append方法将i存入nam空列表 print(nam)
以上代码执行结果为:
['h', 'e', 'l', 'l', 'o']
再比如字典:
ee = {'lihua':1,'wangwu':2,'zhaosi':3,'wangermazi':4} print(ee) print(type(ee)) name = list(ee) print(name) print(type(name))
以上代码执行结果为:
{'lihua': 1, 'wangwu': 2, 'zhaosi': 3, 'wangermazi': 4} <class 'dict'> ['lihua', 'wangwu', 'zhaosi', 'wangermazi'] <class 'list'>
四:列表的内置方法
4.1按索引存取值:
正向取:
ll = ['lizi',1,666,'nb'] print(ll[0])
以上代码执行结果为:
lizi
反向取:
ll = ['lizi',1,666,'nbgls'] print(ll[-1])
以上代码执行结果为:
nbgls
修改值:
ll = ['lizi',1,666,'nbgls'] ll[3] = 'lizi666' print(ll)
以上代码执行结果为:
['lizi', 1, 666, 'lizi666']
需要注意的是,无论是取值还是赋值都无法对一个不存在的索引进行操作,操作必报indexerror错误:
ll = ['lizi',1,666,'nbgls'] ll[4] = 'lizi666' print(ll)
以上代码执行结果为:
Traceback (most recent call last): File "D:\PyCharm\lizi\basis\20200225\list.py", line 33, in <module> ll[4] = 'lizi666' IndexError: list assignment index out of range
4.2列表添加值:
追加:
ll = ['lizi',1,666,'nbgls'] ll.append('woaini') print(ll)
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', 'woaini']
插入:
ll = ['lizi',1,666,'nbgls'] ll.insert(2,99999) print(ll)
以上代码执行结果为:
['lizi', 1, 99999, 666, 'nbgls']
现在问题来了,我有一个需求要将一个列表里的值插入到另一个列表怎么做呢?使用append方法试一下:
sss = [1,2,3] ll = ['lizi',1,666,'nbgls'] ll.append(sss) print(ll)
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', [1, 2, 3]]
显然这与我的需求是相违背的,那么既然append插不了我用for遍历插总可以了吧:
sss = [1,2,3] ll = ['lizi',1,666,'nbgls'] for i in sss: ll.append(i) print(ll)
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', 1, 2, 3]
很好,要的就是这种效果。
但是问题又来了,不复杂的一个需求为什么要用一个循环去解决呢是不是太麻烦了?
python提供方法的初衷就是把一些常用的操作进行封装方便直接使用,在上面这种情况下python提供了extend方法:
sss = [1,2,3] ll = ['lizi',1,666,'nbgls'] ll.extend(sss) # for i in sss: print(ll) # ll.append(i)
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', 1, 2, 3]
这下好了,不用循环了只需一个.方法即可解决实际问题!
4.3删除列表值:
单纯删除:
ll = ['lizi',1,666,'nbgls'] del ll[2] print(ll)
以上代码执行结果为:
['lizi', 1, 'nbgls']
del只是单纯的根据索引将值删除,没有任何返回值,如果你强行定义一个返回值,那么解释器会报语法错误
根据元素删除:
ll = ['lizi',1,666,'nbgls'] ll.pop() print(ll)
以上代码执行结果为:
['lizi', 1, 666]
.pop()方法可以根据在()里指定索引的方式删除值,如果()里没有指定索引,那么默认会删除最后一个索引值
.pop()方法有返回值:
ll = ['lizi',1,666,'nbgls'] des = ll.pop(2) print(des)
以上代码执行结果为:
666
可以发现,以des定义的返回值的结果,正是.pop()方法删除的那个索引值
根据元素删除:
ll = ['lizi',1,666,'nbgls'] ll.remove(666) print(ll)
以上代码执行结果为:
['lizi', 1, 'nbgls']
.remove()方法只能用元素去删除,如果你想使用该删除一个列表,那么你只能将要删除的列表整个写入.remove()方法的括号里
.remove()方法也有返回值但它返回的是一个None:
ll = ['lizi',1,666,'nbgls'] des = ll.remove(666) print(des)
以上代码执行结果为:
None
所以,如果你想利用返回值来进行后面的操作的话,那么还是使用.pop()方法比较好。反之,如果你只是单纯的想删除某一个元素,那么del和.remove()比较适用
4.4列表的切片操作:
切片操作只要记住一句话,顾头不顾尾
指定索引位置进行切片:
ll = ['lizi',1,666,'nbgls'] print(ll[0:-1])
以上代码执行结果为:
['lizi', 1, 666]
从结果可以看出,取值范围从索引位置0开始到3之前也就是2结束
根据条件按索引取值:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp'] print(ll[0:6:2])
以上代码执行结果为:
['lizi', 666, '赵日天']
从结果可以看出,取值范围从0开始到6之前也就是5结束,取值方式为每两个位置取一次值
前边介绍的是从前往后取值,那我如果想从最后一个往前取值呢?倒叙取值:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp'] print(ll[:0:-1])
以上代码执行结果为:
['lsp', '小王八', '赵日天', 'nbgls', 666, 1]
从结果可以看出,如果想倒叙取值,那么就算每一个取一次也要加个-1,两次就是-2
既然顾头不顾尾那我是不是永远没法取最后一个值呢?完整取值可以使用len()方法:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp'] print(ll[0:len(ll)])
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', '赵日天', '小王八', 'lsp']
len()方法可以获取列表的长度,在某些情况下比较有用。当然对于上面的需求,还有更简便的取完整值方法:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp'] print(ll[:])
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', '赵日天', '小王八', 'lsp']
反向取亦然:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp'] print(ll[::-1])
以上代码执行结果为:
['lsp', '小王八', '赵日天', 'nbgls', 666, 1, 'lizi']
切片操作相当于浅copy,也就是说如果给原值赋一个新值,如果原值改变,那么新值也会跟着改变:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp',[1,2,3]] new_ll = ll print(ll) print(new_ll) ll[-1][1] = 333 print(ll) print(new_ll)
以上代码执行结果为:
['lizi', 1, 666, 'nbgls', '赵日天', '小王八', 'lsp', [1, 2, 3]] ['lizi', 1, 666, 'nbgls', '赵日天', '小王八', 'lsp', [1, 2, 3]] ['lizi', 1, 666, 'nbgls', '赵日天', '小王八', 'lsp', [1, 333, 3]] ['lizi', 1, 666, 'nbgls', '赵日天', '小王八', 'lsp', [1, 333, 3]]
从结果可以看出,在ll列表的最后一个值的第一个索引改变的情况下,new_ll的值也跟着一起改变
in方法可以判断某个值是否为某个列表的元素:
ll = ['lizi',1,666,'nbgls','赵日天','小王八','lsp',[1,2,3]] print('lizi' in ll) print('hahah' in ll)
以上代码执行结果为:
True
False
in方法的结果只有true和false
4.5列表的其他一些方法:
.count()方法:
l = ['lizi',1,666,'nbgls','赵日天','小王八','lsp',[1,2,3],1] print(l.count(1))
以上代码执行结果为:
由执行结果可知,.count()方法的作用是统计列表中某个元素出现的总次数
.index()方法:
l = ['lizi',666,'nbgls',1,'赵日天','小王八','lsp',[1,2,3],1] print(l.index(1))
以上代码执行结果为:
由执行结果可知,.index()方法的作用是得到列表中某个元素的索引位置,如果有相同的元素,那么得到的结果为出现的第一个元素位置
.reverse()方法:
l = ['lizi',666,'nbgls',1,'赵日天','小王八','lsp',[1,2,3],1] l.reverse() print(l)
以上代码执行结果为:
[1, [1, 2, 3], 'lsp', '小王八', '赵日天', 1, 'nbgls', 666, 'lizi']
由执行结果可知,.reverse()方法的作用就是将列表倒过来
.sort()方法:
l = [1,2,3,4,7,8,6,5] l.sort() print(l)
以上代码执行结果为:
[1, 2, 3, 4, 5, 6, 7, 8]
由执行结果可知,.sort()方法的默认作用就是将列表按从小到大的顺序排序
那如果我想按从大到小的顺序排呢?
.sort()方法可以传两个值,其中key可以与函数配合使用,reverse设置为True,就可以实现将元素按从大到小的顺序排:
l = [1,2,3,4,7,8,6,5] l.sort(reverse=True) print(l)
以上代码执行结果为:
[8, 7, 6, 5, 4, 3, 2, 1]
需要注意的是,.sort()方法只能将同类型元素进行排序,如果非要排不同种元素那么会直接报数据类型错误:
l = [1,2,3,4,7,'nb',8,6,5] l.sort() print(l)
以上代码执行结果为:
Traceback (most recent call last): File "D:\PyCharm\lizi\basis\20200225\list.py", line 65, in <module> l.sort() TypeError: '<' not supported between instances of 'str' and 'int'
浮点型和整型可以进行排序
.clear()方法:
l = [1,2,3,4,7,'nb',8,6,5] l.clear() print(l)
以上代码执行结果为:
由执行结果可知,.clear()方法的作用是将列表清空