数据类型之列表
一、概要
- 列表基础
- 列表的基本操作
- 列表的主要方法
- 列表的其它方法
- 总结
二、列表的基础
列表是序列中的一种,所以所有序列的属性或者方法都适用于列表,而序列就是使用一对中括号将序列中的元素值括起来。
(一) 创建列表
列表是可迭代对象,能够进行for循环,创建形式也是多样的。
#直接通过[]进行创建
l= [1,"hello",[4,5],{"name":"zhangsan"}]
#关键字list进行创建
l2 = list([1,23,3])
l3 = [1,23,["shen","jianping"],43,566,77]
print(l2) #[1, 23, 3]
print(type(l2))#<class 'list'>
(二) 索引
列表中的所有元素都是有编号的,编号是从0开始递增,这个编号就是列表元素的索引,所有的元素都可以通过索引访问。
l=['zhangsan','lisi','wangwu']
print(l[0])#zhangsan
print(l[2])#wangwu
列表的索引和字符串的索引是一样的,也可以通过负数取值,-1代表最后一个,依次类推。
l=['zhangsan','lisi','wangwu']
print(l[-1])#wangwu
print(l[-2])#lisi
(三)分片
分片是从列表A中获取一个子列表B,从A中获取B,需要指定B在A中的开始索引以及结束索引,因此,分片操作需要指定两个索引。
l=[1,2,3,4,5,6,7]
print(l[2:5])#[3, 4, 5]
print(l[-4:-2])#[4, 5]
使用负数作为开始索引,并省略结束索引
l=[1,2,3,4,5,6,7]
print(l[-3:])#[5, 6, 7]
print(l[-3:7])#[5, 6, 7] 结尾使用了正整数作为索引
省略开始索引
l=[1,2,3,4,5,6,7]
print(l[:3])#[1, 2, 3] 获取前三个值的列表
设置步长
对列表进行分片时,默认的步长是1,即获取相邻的元素,如果获取非相邻元素,就需要指定步长了。
l=[1,2,3,4,5,6,7]
print(l[:3:2])#[1, 3]
步长可以是负数,但不可以为0,如果为负数,分片会从列表的右侧开始,所以开始的索引要大于结束的索引。
l=[1,2,3,4,5,6,7,8,9]
print(l[7:2:-2])#[8, 6, 4]
注意:
- 分片取值左取右不取,如果步长为负数,则相反。
(四) 列表相加
列表的相加是收尾相连,并不是元素的相加。
l1=[1,2,3,4,5,6,7,8,9]
l2=['h','e','l','l','0']
print(l1+l2)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 'h', 'e', 'l', 'l', '0']
注意:列表不能和字符串这样不同类型的数据进行相加。
(五)列表的乘法
l=[1,2,3,4,5,6,7,8,9]
print(l*2)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(六) 检查某个值是否属于列表
使用in进行判断
l=[1,2,3,4,5,6,7,8,9]
print(2 in l)#True
(七)列表长度、最大值、最小值
这是三个内建函数,len()、max()、min(),用于返回列表中元素的数量、最大的元素、最小的元素。注意使用min()和max()方法时,列表中的每个元素必须是可比较。
values=[1,2,3,4,5,6,7,8,9]
print(len(values))#9
print(max(values))#9
print(min(values))#1
(八) 案例
要求输入年、月、日,并且将月转换成中文输出,如:输入的月份为4,要求输出四月。
months = [
"一月",
"二月"
...,
"十二月"
]
year = input("年:")
month = input("月(1-12):")
day = input("日(1-31):")
monthNum = int(month)
monthName = months[monthNum-1]
res = "%s年%s月%s" % (year, monthName, day)
三、列表的基本操作
(一) 列表元素赋值
之前使用列表索引获取列表中的某个值,而修改列表中的某一个元素,使用一对中括号指定元素在列表中的索引,然后使用赋值运算符(“=”)进行赋值。
l=["hello","world"]
l[1]="bright"
print(l)#['hello', 'bright']
(二) 删除列表元素
使用del进行删除
l=["hello","world"]
del l[1]
print(l)#['hello']
(三) 分片赋值
分片赋值是将列表的某一部分通过分片获取,然后将其替换
l=["a","b","c","d","e"]
l[2:]=[1,2,3]
print(l)#['a', 'b', 1, 2, 3]
利用这个特性可以在一个列表中插入一些元素或者删除一些元素
l=["a","b","c","d","e"]
#插入元素
l[1:1]=[1,2,3,4,5]#['a', 1, 2, 3, 4, 5, 'b', 'c', 'd', 'e']
print(l)
#删除元素
l[1:3]=[]
print(l)#['a', 3, 4, 5, 'b', 'c', 'd', 'e']
(四) 案例
列表拼接:list1 = list2 = [1,2,3,4,5,6]
list1[3:] = list2[3:]
print(list1)
四、列表的主要方法
(一) append()
append 在列表最后插入新的值
l=[1,2,3]
l.append(4) #添加单个元素
print(l) #[1, 2, 3, 4]
l=[1,2,3]
l.append([4,5])#添加列表
print(l) #[1, 2, 3, [4, 5]]
(二) clear()
清除列表的内容
l=[1,2,3]
l.clear()
print(l)#[]
(三) copy()
copy后就是一个新的对象,与之前的就没有关系,修改新的列表,不会影响之前的列表。
l1=[1,2,3]
print(id(l1))#90554760
l2=l1.copy()
print(id(l2))#85322120
l3=l1
print(id(l3))#90554760
(四) count()
统计某个元素在列表中出现的次数
l=['a','b','c','a','d','a']
print(l.count('a'))#3
(五) extend()
在原列表后扩展新的列表
l1=[1,2,3]
l2=[4,5,6]
l1.extend(l2)
print(l1) #[1, 2, 3, 4, 5, 6]
使用列表连接以及分片也是可以达到这种效果的,但是效率没有这个高。
#列表连接
l1=[1,2,3]
l2=[4,5,6]
print(l1+l2)#[1, 2, 3, 4, 5, 6]
#切片
l1=[1,2,3]
l2=[4,5,6]
l1[len(l1):]=l2
print(l1)#[1, 2, 3, 4, 5, 6]
(六) index()
从列表中找出某个值第一次出项的索引值
l=['a','b','c','a','d']
print(l.index('a'))#0
如果元素不在列表中就会抛出异常
l=['a','b','c','a','d']
print(l.index('e'))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-11-862cf3f75961> in <module>
1 l=['a','b','c','a','d']
2 print(l.index('a'))#0
----> 3 print(l.index('e'))
ValueError: 'e' is not in list
(七) insert()
用于将值插入都列表指定的位置
l=['a','b','c','a','d']
#在索引为2的地方插入值
l.insert(2,[4,5,6])#['a', 'b', [4, 5, 6], 'c', 'a', 'd']
print(l)
同样也可以使用分片赋值
l=['a','b','c','a','d']
l[2:2]=[[4,5,6]]
print(l)#['a', 'b', [4, 5, 6], 'c', 'a', 'd']
(八) pop()
用于移除列表中的元素(默认移除列表最后一个元素),并返回该元素的值
l=['a','b','c','a','d']
result=l.pop()
result1=l.pop(1)
print(result)#d 返回默认删除的最后一个元素
print(result1)# 返回指定的删除元素
print(l)#['a', 'b', 'c', 'a']
(九) remove()
用于移除列表中某个元素的的第一次匹配项
l=['a','b','c']
result=l.remove('a')
#不会返回删除的元素
print(result)#None
print(l)#['b', 'c']
remove中删除不存在的元素会抛出异常
(十) reverse()
用于将列表中的元素反向存放
l=[1,2,3,4,5,6]
#将列表元素倒序排放
l.reverse()
print(l)#[6, 5, 4, 3, 2, 1]
(十一) sort()
用于对列表进行排序,调用该方法会改变原来的列表
l=[1,4,3,6,7,2]
#对列表进行升序排列(默认方式)
l.sort()
print(l)#[1, 2, 3, 4, 6, 7]
l=[1,4,3,6,7,2]
#对列表进行降序排列,与reverse方法效果一样
l.sort(reverse=True)
print(l)#[7, 6, 4, 3, 2, 1]
使用sort排序会直接修改原列表,如果想修改其副本,可以使用以下方法:
- 分片操作
l=[1,4,3,6,7,2]
l1=l[:]
l1.sort()
print(l)#[1, 4, 3, 6, 7, 2]
print(l1)#[1, 2, 3, 4, 6, 7]
- sorted函数
l=[1,4,3,6,7,2]
l1=sorted(l)
print(l)#[1, 4, 3, 6, 7, 2]
print(l1)#[1, 2, 3, 4, 6, 7]
五、列表的其它方法
- enumerate
l= [1,"hello",[4,5],{"name":"bright"}]
for i,j in enumerate(l):
print(i,j)
-----------------------------------------------------输出索引和值----------------------------
0 1
1 hello
2 [4, 5]
3 {'name': 'bright'}
六、内存模型
画图说明:引用类型
七、案例
(一) 矩阵计算
arr1 = [
[1,1],
[2,3]
]
arr2 = [
[0,1],
[3,5]
]
arr3 = [
[arr1[0][0]+arr2[0][0],arr1[0][1]+arr2[0][1]],
[arr1[1][0] + arr2[1][0], arr1[1][1] + arr2[1][1]],
]
(二) copy、deepcopy
import copy
list1 = ["abc", 6, [1, 2, 3]]
list2 = list1.copy()
list3 = copy.deepcopy(list1)
print(list2)
print(list3)
list1[0] = 9
list1[2][0] = 10
print(list2)
print(list3)
### 输出 ###
['abc', 6, [1, 2, 3]]
['abc', 6, [1, 2, 3]]
['abc', 6, [10, 2, 3]]
['abc', 6, [1, 2, 3]]
八、总结
至少得需要知道增删改查:
- 增 append、切片、insert
- 删 remove、切片、del、clear
- 改 索引、切片
- 查 索引