Python基础之列表
介绍
Python的列表是一个有序可重复的元素集合,其元素的数据类型可以不同,可以修改。
按照元素的特征,列表可分为普通列表(数据类型相同)、混合列表(数据类型不同)、空列表(没有元素)。
一、基础语法
1、访问列表中的元素
列表从0开始为它的每一个元素顺序创建下标索引,直到总长度减一 。
注意要确保索引不越界,一旦访问的 索引超过范围,会抛出异常。
lis=['a','b','c']
print(lis[0]) # a
print(lis[3]) # IndexError: list index out of range
2、修改元素的值
li=[1,2,3]
li[1]=4
print(li) # [1, 4, 3]
li[1:]=5,6
print(li) # [1, 5, 6]
3、删除元素
3.1 del语句
根据索引删除
li=['a','b','c']
del li[0]
print(li) # ['b', 'c']
3.2 remove()方法
直接根据值删除
li=['a','b','c']
li.remove('a')
print(li) #['b', 'c']
li1=['a','b','c']
print(li1.remove('a')) # None
3.3 pop()方法
根据索引号移除列表中的一个元素 (默认最后一个元素) ,并且返回该元素的值
li=['a','b','c']
li.pop()
print(li) # ['a', 'b']
li.pop(1)
print(li) # ['a']
4、列表常用函数
len() 返回列表元素个数
max() 返回列表元素最大值
min() 返回列表元素最小值
5、列表特殊操作
5.1 列表的组合
li1=[1,2,3]
li2=[4,5,6]
print(li1+li2) # [1, 2, 3, 4, 5, 6]
print(li1.__add__(li2)) # [1, 2, 3, 4, 5, 6]
5.2 列表的乘法
li=['hi']
print(li*3) # ['hi', 'hi', 'hi']
print(li.__mul__(3)) # ['hi', 'hi', 'hi']
5.3 判断元素是否在列表中
li1=[1,2,3]
print(3 in li1) # True
print(li1.__contains__(3)) # True
6、切片
以冒号分割索引,start代表起点索引,end代表结束点索引,step为步长默认为1。省略start表示以0开始,省略end表示到列表的结尾。
与字符串切片类似,左闭右开原则。
7、排序和反转
默认升序 sort(key=None,reverse=False)
降序 sort(reverse=True)
li=[1,2,3,4,1]
li.sort() # [1, 1, 2, 3, 4]
print(li)
li.sort(reverse=True) # [4, 3, 2, 1, 1]
print(li)
反转 reverse()
li=[1,2,3,4,1]
li.reverse() # [1, 4, 3, 2, 1]
print(li)
8、多维列表(嵌套列表)
li=[[1,2,3],[4,5,6]]
print(li[0][2]) # 3
9、列表的遍历
a=[1,2,3,4,5]
for i in a: # 遍历每一个元素本身
print(i)
for i in range(len(a)): # 遍历列表的下标,通过下标取值
print(i,a[i])
10、列表的内置方法
10.1 count()
统计某个元素在列表中出现的次数
li=[1,2,3,4,1]
print(li.count(1)) # 2
10.2 append()
在列表末尾添加新的对象
li1=[1,2,3]
li2=[4]
li1.append(li2)
print(li1) # [1, 2, 3, [4]]
10.3 extend()
在列表末尾追加另一个序列中的多个值
li1=[1,2,3]
li2=[4]
li1.extend(li2)
print(li1) # [1, 2, 3, 4]
10.4 insert(index,obj)
将对象插入列表
li1=[1,2,3]
li1.insert(2,4)
print(li1) # [1, 2, 4, 3]
10.5 index()
从列表中找出某个值第一匹配项的索引位置
li1=[1,2,3,1]
print(li1.index(1)) # 0
10.6 clear()
清空列表
li1=[1,2,3]
li1.clear()
print(li1) # []
注意:其中的类似 append,insert, remove 等方法会修改列表本身,并且没有返回值(严格的说是返回None)。
11、列表的复制
(1)copy: 浅复制 ,不会产生一个独立的对象单独存在,它只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
(2)deepcopy: 深复制 ,将被复制对象完全再复制一遍作为独立的新个体单独存在,故改变原有被复制对象不会对已经复制出来的新对象产生影响。
(3.1) 对于简单的object,copy和 deepcopy没区别。
copy
import copy
a=[1,2,3,4]
b=copy.copy(a)
a[2]=6
print(a) # [1, 2, 6, 4]
print(b) # [1, 2, 3, 4]
deepcopy
import copy
a=[1,2,3,4]
b=copy.deepcopy(a)
a[2]=6
print(a) # [1, 2, 6, 4]
print(b) # [1, 2, 3, 4]
(3.2) 复杂的object, 如嵌套列表,copy中的子list并未从原object中真的「独立」出来,即如果你改变原object的子list中的元素,copy的内容会跟着一起变。
copy
import copy
a=[1,2,[3,4]]
b=copy.copy(a)
a[2][0]=6
print(a) # [1, 2, [6, 4]]
print(b) # [1, 2, [6, 4]]
deepcopy
import copy
a=[1,2,[3,4]]
b=copy.deepcopy(a)
a[2][0]=6
print(a) # [1, 2, [6, 4]]
print(b) # [1, 2, [3, 4]]
二、列表推导式
1. 例题
将列表中小于0的元素平方后添加到新的列表
li=[1,2,3,-4,-5]
li2=[i**2 for i in li if i < 0]
print(li2) # [16, 25]
方法二: 匿名函数 lambda
li=[1,2,3,-4,-5]
li3=list(filter(lambda i:i<0,li)) # filter过滤出符合条件的
li4=list(map(lambda i:i**2,li3))
print(li4) # [16, 25]
2.推导式的嵌套
li=[i+j for i in '12' for j in 'ab']
print(li) # ['1a', '1b', '2a', '2b']
dic={'name':'wj','age':18}
li1=[k+':'+str(v) for k,v in dic.items()]
print(li1) # ['name:wj', 'age:18']