python学习5
数据类型
列表
1.列表的定义与访问
列表的定义与创建
- 列表的格式
namelist = [] #定义一个空的列表
print(namelist,type(namelist)) #[] <class 'list'>
namelist = ["张三","李四","王五"]
#比C语言的数组强大的地方在于列表中的元素可以是不同类型的
testList = [1, 'a', True, 2.3, 1] #元素内容可以重复
- 通过list()创建列表
a = list() #创建一个空的列表对象
print(a) #[]
a = list(range(10)) #将range所定义的数据作为列表元素 [0,9)
print(a) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = list(range(2,-3,-1)) #[2, 1, 0, -1, -2]
print(a)
- 通过推导式创建列表
a = [x*2 for x in range(5)] #循环创建多个元素
操作名称 | 操作方法 | 举例 |
---|---|---|
访问列表中的元素 | 通过下标直接访问 | print(list[0]) |
列表的切片 | 使用[::] | list1[2:5:2] |
遍历列表 | 通过for循环 | for i in list1:print(i) |
- 打印列表
nameList = ['xiaoming','xiaohong','xiaozhang']
print(nameList[0])
print(nameList[1])
print(nameList[2])
- 列表的循环遍历
#为了更有效率的输出列表的每个数据,可以使用循环来完成
namelist = ["小张","小王","小李"]
for name in namelist:
print(name)
2.常用操作
常用操作:len()、max()、min()、sum()
操作名称 | 操作方法 |
---|---|
获取列表长度 | len() |
获取列表元素最大值 | max() |
获取列表元素最小值 | min() |
其它类型对象转换成列表 | list() |
# (1) len() 获取列表元素个数
namelist = ["小张","小王","小李","小赵"]
print(len(namelist)) #4
i = 0
while i < len(namelist):
print(namelist[i])
i += 1
#(2) max() 和 min() 获取列表中最大和最小的元素
list1 = [3,2,1]
list2 = ["aa","bb","cc"]
#list1 = [False,2.0,30,"aa"] #max和min函数调用时会报错,字符串和数值无法比较
list1 = [0,False,2.0,30]
print(max(list1)) #30
print(min(list1)) #0
#(3) sum() 对全部为数值型元素的列表求和
list1 = [10,20,30,2.0,True]
print(sum(list1)) #63.0
增/删/改/查
操作名称 | 操作方法 | 举例 |
---|---|---|
【增】新增数据到列表尾部 | 使用append方法 | list1.append(5) |
【增】列表的追加 | 使用extend方法 | list1.extend(list2) |
【增】列表的加法操作 | + | list3 = list1 + list2 |
【增】列表数据插入 | insert方法 | list1.insert(1, 3) |
【删】列表的删除 | del :我们通过索引删除指定位置的元素 remove:移除列表中指定值的第一个匹配值。如果没找到的话,会抛异常 | del list1[0] list1.remove(1) |
【删】弹出列表尾部元素 | 使用pop方法 | list.pop() |
【改】跟新列表中的数据 | 通过下标原地修改 | list1[0] = 8 |
【查】列表成员关系 | in 、not in | 2 in list1 |
【查】指定区间某元素的牵引 | index方法 | list.index(“a”,1,4) |
【查】列表中元素出现次数 | count方法 | list.count(“c”) |
【排】列表的排序 | sort方法 | list.sort() |
【排】列表的反转 | reverse方法 | list.reverse() |
#增
#1.append()方法
namelist = ["小张","小王","小李","小明"]
print("-"*6+"增加前,名单列表的数据"+"-"*6)
for name in namelist:
print(name,end=",")
nametemp = input("\n请输入学生姓名:")
namelist.append(nametemp) #在末尾追加一个元素
print("-"*6+"增加后,名单列表的数据"+"-"*6)
for name in namelist:
print(name,end=",")
#2.extend扩展
a = [1,2]
b = [3,4]
a.append(b) #将列表当作一个元素,加入到a列表中 [1, 2, [3, 4]]
print(a)
a.extend(b) #将列表中每个元素,逐一追加到a列表中
print(a)
#3.+连接
list1 = [10,20,30]
list2 = [40,50]
res = list1 + list2
print(res,id(res)) #[10, 20, 30, 40, 50] 1872099723776
print(list1,id(list1)) #[10, 20, 30] 1872144236928
list1.append(list2)
print(list1,id(list1)) #[10, 20, 30, [40, 50]] 1623135238528
#4.insert插入
a = [0,1,2]
a.insert(1,3) #第一个变量表示下标,第二个表示元素(对象)
print(a) #指定下表位置插入元素 [0, 3, 1, 2]
#5.*重复 (了解)
list1 = [1,2,3]
list2 = list1 * 3
print(list2) #[1, 2, 3, 1, 2, 3, 1, 2, 3]
#删
movieName = ["速度与激情","指环王","复仇者联盟","加勒比海盗","指环王","美国队长"]
print("----删除前,电影列表的数据----")
for name in movieName:
print(name,end=",")
print()
#1.del
del movieName[1] #在指定位置删除一个元素,没有返回值
print(movieName) #['速度与激情', '复仇者联盟', '加勒比海盗', '指环王', '美国队长']
#2.pop弹出
movie = movieName.pop() #默认弹出末尾最后一个元素,有返回值(被弹出的那个元素)
print("被pop弹出的元素:",movie)
movie = movieName.pop(-2) #弹出指定位置的元素,有返回值(被弹出的那个元素)
print("被pop弹出的元素:",movie)
#3.remove移除
movieName.remove("指环王") #直接删除指定“内容”的元素,但只删除匹配到的第一个
movieName.remove("指环王2") #删除不存在的元素,报错。
#改
namelist = ["小张","小王","小李","小明"]
print("-----修改前,名单列表的数据-----")
for name in namelist:
print(name)
namelist[2] = "小红"
print("-----修改后,名单列表的数据-----")
for name in namelist:
print(name)
#查
#1.[in],[not in]
namelist = ["小张","小王","小李","小明"]
findName = input("请输入你要查找的学生姓名:")
if findName in namelist:
print("在学员名单中找到了相同的名字")
else:
print("没有找到")
#2.index
mylist = ["a","b","c","a","b"]
print(mylist.index("a",1,4)) #可以查找指定下标范围的元素,并返回找到对应数据的下标
print(mylist.index("a",1,3)) #范围区间m左闭右开 [1,3)
#3.count
print(mylist.count("a")) #统计某个元素出现次数
#4.排序和反转 sort 、 reverse
a = [1,4,2,3]
print(a,id(a)) #[1, 4, 2, 3] a的地址没有改变
a.reverse()
print(a,id(a)) #[3, 2, 4, 1] a的地址没有改变
a.sort() #升序
print(a,id(a)) #a的地址没有改变
a.sort(reverse=True) #降序
print(a,id(a)) #a的地址没有改变
3.列表的嵌套
- 列表嵌套
类似while循环的嵌套,列表也是支持嵌套的
一个列表中的元素又是一个列表,那么这就是列表的嵌套
namelist = [] #一维空列表
namelist = [[],[],[]] #有3个元素的坑列表,每个元素都是一个空列表
zhangsan = ["张三",20,"男"]
lisi = ["李四",22,"女"]
wangwu = ["王五",23,"男"]
namelist = [zhangsan,lisi,wangwu] #二维列表
print(namelist)
"""
[['张三', 20, '男'], #[0][0],[0][1],[0][2]
['李四', 22, '女'], #[1][0],[1][1],[1][2]
['王五', 23, '男']] #[2][0],[2][1],[2][2]
"""
print(namelist[0]) #通过索引,获取到的第一个元素是一个列表
print(namelist[0][0]) #通过第二个中括号的索引,获取的是第一个列表中的第一个元素
for person in namelist:
for i in person:
print(i,end=",")
print()
4.浅拷贝和深拷贝
变量赋值
#变量赋值
num1 = [1,2,3]
num2 = num1 #num1将地址值复制给了num2
num2.append(4) #所以num2修改了里面的内容,num1取出来的内容也就变了
print("num1:",num1,id(num1))
print("num2:",num2,id(num2))
浅拷贝
#浅拷贝
num1 = [10,[2,3]]
num2 = num1.copy() #将num1所指向的数据内容(地址值),复制了一份给num2
#num2.append(4) #修改num2,num1不受影响
print("num1:",num1,id(num1)) #num1和num2地址值不同
print("num2:",num2,id(num2))
#num1[0] = 8 #修改num1,相当于修改了地址指向,num2不受影响
print("num1[0]:",num1[0],id(num1[0]))
print("num2[0]:",num2[0],id(num2[0]))
print("num1[1]:",num1[1],id(num1[1]))
print("num2[1]:",num2[1],id(num2[1]))
深拷贝
import copy
num1 = [10,[2,3]]
num2 = copy.deepcopy(num1) #将num1所指向的数据元素,复制了一份给num2
# num1[-1].append(8) #所以,修改num1的列表元素中的内容,num2中对应的列表元素也变了
print("num1中列表的地址:",id(num1[-1]),"\nnum2中列表的地址:",id(num2[-1]))
#说明列表中的”列表元素“没有复制元素内容,仅仅复制的是地址。
print("num1:",num1,id(num1))
print("num2:",num2,id(num2))
print("num1[0]:",num1[0],id(num1[0]))
print("num2[0]:",num2[0],id(num2[0]))
print("num1[1]:",num1[1],id(num1[1]))
print("num2[1]:",num2[1],id(num2[1]))
小结
- 浅拷贝: 只能copy列表的一级元素,复制了嵌套的可变数据类型的地址
- 深拷贝: 能够copy列表所有层级的元素,复制了嵌套的可变数据类型元素