列表 (list)
列表基础
- 如果要同时处理多个数据,可以考虑列表
1.列表是容器型数据类型(序列);将[]作为容器的标志,里面多个数据用逗号隔开:[数据1,数据2,数据3…]
2.列表是可变的(可变指的是列表中的个数和元素的值可变 - 列表支持增删改)
列表是有序的(元素有顺序对应的位置信息;元素的顺序影响结果 - 列表支持索引操作)
3.列表对元素的要求:没有要求,任何类型的数据都可以作为列表的元素
注:元素 - 容器中每一个独立的数据,就是这个容器的元素
# 1)空列表
list1 = [ ]
print(list)
# 2) 列表是有序的
print([10, 20, 30] == [30, 20, 10]) # False
print({10, 20, 30} == {20, 10, 30}) # True 集合无序,顺序不影响结果
# 3) 列表元素可以是任何类型的数据
list2 = [10, 20, 30]
names = ['小明', '小花', '小张']
# b.一个列表的元素可以是不同类型的数据
list3 = [10, 20, 20.5, True, None, '小张']
# c.列表中的元素也可以是列表
list4 = [45, 20, [10, 20]]
列表查询操作 (获取列表中的元素的值)
1.查单个 - 获取一个元素
- 语法:
列表[索引]
说明
列表 - 需要获取元素的列表对象(可以是保存一个列表的变量,也可以是具体的列数据)
[] - 固定写法
索引 - 又叫下标;指的是元素在列表中的位置信息
列表一旦确定,列表中每个元素对应的索引就确定
a:元素从前往后索引从0开始
b:元素从后往前从-1开始不断减少
nums = [10, 20, 30, 40]
print(nums[1])
print([10, 20, 30, 40][1])
print(nums[-1]) #40 负向索引
print(nums[3]) #40 正向索引
#print(nums[-6]) #报错!索引越界
2. 切片 - 同时获取多个元素(列表结果的结果是列表)
1) 完整语法:
列表[开始下标:结束下标:步长]
a.说明
列表 - 需要获取元素列表
[] - 固定写法
开始下标、结束下标、步长 - 必须是整数
开始下标 - 决定从哪开始取
结束下标 - 决定从哪结束
步长 - 决定取的时候怎么取(是一个一个的按顺序取,还是跳着取,从前往后取还是从后往前取)
b.确定切片结果
第一步:先确定结果是否为空,看开始下标对应的位置方向和步长的方向是否一致
一致结果不为空,不一致结果一定为空
第二步:如果结果不为空,再确定切片的有效范围:开始下标对应的元素能取到,结束下标对应元素取不到
第三步:在有效范围内按照步长的方向和绝对值获取元素。
方向: 步长为正,从开始下标到结束下标从前往后取;步长为负从后往前取
绝对值:绝对值为1,就1个1个的取;绝对值为2,取1个跳1个;绝对值为3:取1个跳过2个在取一个
c:怎么写切片代码获取指定元素
确定开始下标: 需要的结果中第一个数据在列表的下标
确定结束下标: 结束下标是结果中最后一项的后一个数据或者前一个数据的下标(看方向)
确定步长:正负看趋势(从前往后取还是从后往前取);再看绝对值
movies = ['肖生克的救赎', '霸王别姬', '阿甘正传', '钢铁侠', '蜘蛛侠', '蝙蝠侠', '蚁人', '雷神', '复仇者联盟']
print(movies[1:3:1])
print(movies[0:-2:2])
print(movies[5:0:2])
print(movies[3:-1:-1])
print(movies[-2:2:-2])
print(movies[6:2:-3])
print(movies[1:-3:3])
print(movies[1:-1:1]) # '霸王别姬','阿甘正传', '钢铁侠', '蜘蛛侠', '蝙蝠侠', '蚁人', '雷神'
print(movies[-1:1:-2]) # '复仇者联盟','蚁人','蜘蛛侠','阿甘正传'
print(movies[-2:5:2]) # []
print(movies[0:-2:4]) # '肖生克的救赎','蜘蛛侠'
print(movies[5:-1:2]) # '蝙蝠侠','雷神'
print(movies[6:-6:-1]) # '蚁人''蝙蝠侠','蜘蛛侠'
2) 切片省略的写法
完整的切片语法:列表[开始下标:结束下标:步长]
a.省略步长:列表[开始下标: 结束下标]
省略步长 - 默认步长为1
b.省略开始下标 - 获取元素从头开始取(步长为正,从第一个元素开始取;步长为负,从最后一个元素开始取)
列表[:结束下标:步长]
c.省略结束下标 - 获取元素时从开始下标开始,取完为止(有可能取到最后一个,也有可能取到第一个)
完整的切片语法:列表[开始下标::步长]
# movies = ['肖生克的救赎', '霸王别姬', '阿甘正传', '钢铁侠', '蜘蛛侠', '蝙蝠侠', '蚁人', '雷神', '复仇者联盟']
print(movies[:-2:2]) # '肖生克的救赎','阿甘正传','蜘蛛侠','蚁人'
print(movies[:2:-2]) # '复仇者联盟','蚁人','蜘蛛侠'
print(movies[4]) # '肖生克的救赎', '霸王别姬', '阿甘正传', '钢铁侠'
movies = ['肖生克的救赎', '霸王别姬', '阿甘正传', '钢铁侠', '蜘蛛侠', '蝙蝠侠', '蚁人', '雷神', '复仇者联盟']
print(movies[2::2]) # '阿甘正传','蜘蛛侠','蚁人','复仇者联盟'
print(movies[4::-1]) # '蜘蛛侠','钢铁侠','阿甘正传','霸王别姬','肖生克的救赎'
print(movies[3:]) # '钢铁侠','蜘蛛侠', '蝙蝠侠', '蚁人', '雷神', '复仇者联盟'
3. 遍历 - 一个一个的获取列表中的所有元素
方法1:
for 变量 in 列表:
循环体(变量依次获取到的就是列表中的每个元素)
方法2:
通过获取所有元素的下标来获取元素
for 变量 in range(len(列表长度)):
循环体(列表[变量])
方法3:
for 变量1,变量2 in enumerate(列表):
循环体(变量1依次获取的是每个元素的下标;变量2依次获取的是每个元素)
scores = [90, 89, 87, 81, 79, 93, 67, 56, 43, 99]
# 方法1: - 直接获取元素
for x in scores:
print(x)
# 方法2
scores = [90, 89, 87, 81, 79, 93, 67, 56, 43, 99]
for x in range(len(scores)):
print(x, scores[x])
# 方法3
for index,item in enumerate(scores):
print('index:', index, 'item:', item)
列表的增删改操作
1.增 - 添加元素
(1)列表.append(元素) - 在指定列表的最后添加指定的元素(不会产生新列表)
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女']
heros.append('剑圣')
print(heros) # ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女','剑圣']
scores = [89, 45, 99, 65, 93, 81, 29, 88, 76, 59, 66]
# 案例:提取scores中所有不及格的分数
#[45,29,59]
new_scores = []
for s in scores:
if s < 60:
new_scores.append(s)
print(new_scores)
# 练习1:利用append删除列表中所有的奇数
nums = [89, 45, 99, 65, 93, 81, 29, 88, 76, 59, 66]
new_nums = []
for i in nums:
if i % 2 == 0:
new_nums.append(i)
print(new_nums)
# 练习2:将scores中所有不及格的分数改成'补考'
scores = [89, 45, 99, 65, 93, 81, 29, 88, 76, 59, 66]
[89, '补考', 99, 65, 93, 81, '补考', 88, 76, '补考', 66]
new_scores = []
for s in scores:
if s < 60:
new_scores.append('补考')
else:
new_scores.append(s)
print(new_scores)
(2) 列表.insert(下标,元素) - 将指定元素插入到列表中指定下标对应的元素前
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女']
print(heros)
heros.insert(-1,'亚索')
print(heros)
heros.insert(2,'石头人')
print(heros)
2.删 - 删除元素
(1) del 列表[下标] - 删除列表中指定下标对应的元素(在原列表中修改)
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女']
del heros[1]
print(heros)
(2) 列表.remove(元素) - 删除列表中的指定元素(如果元素不存在会报错)
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女','金克斯']
heros.remove('小炮')
print(heros) # ['寒冰射手','维鲁斯','金克斯','小法','卡牌','蛇女','金克斯']
heroes.remove('塔姆') # 列表中没有该元素报错
#列表中有多个重复值,默认删除第一个
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女','金克斯']
heros.remove('金克斯')
print(heros) # ['寒冰射手','小炮','维鲁斯','小法','卡牌','蛇女','金克斯']
(3) 列表.pop() - 取出列表最后一个元素,并返回
列表.pop(下标) - 取出列表中指定下标对应的元素,并返回
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女']
heros.pop()
result = heros.pop()
print(heros,result)
heros.pop(0)
print(heros)
3.改 - 修改元素的值
列表[下标] = 新元素 - 将列表中指定下标对应的元素改成新元素
heros = ['寒冰射手','小炮','维鲁斯','金克斯','小法','卡牌','蛇女']
print(heros)
heros[1] = '孙悟空'
print(heros) # ['寒冰射手','孙悟空','维鲁斯','金克斯','小法','卡牌','蛇女']
# 练习:将scores中所有低于60分的成绩修改成0分(使用改)
scores = [89, 45, 99, 65, 93, 81, 29, 88, 76, 59, 66]
# 方法1:
for index in range(len(scores)):
if scores[index] < 60: #取出小于60的下标
scores[index] = 0
print(scores)
#方法2:
scores = [89, 45, 99, 65, 93, 81, 29, 88, 76, 59, 66]
for index,item in enumerate(scores):
if item < 60:
scores[index] = 0
print(scores)
列表相关函数
1. sum(数字序列) 求数字序列中所有元素的数值和
scores = [98, 23, 56, 88, 90, 62]
result = sum(scores)
print(result)
result = sum(range(101))
print(result)
2. max min
(1) max(序列) - 求序列中的最大元素
(2) min(序列) - 求序列中的最小元素
scores = [98, 23, 56, 88, 90, 62]
result = max(scores)
print(result)
result = min(scores)
print(result)
# 补充:求最大值的逻辑
# 假设第一个元素是最大值保存到变量中,然后依次取到后面的每个元素和保存最大值的变量进行比较,如果取到的数比最大值还大,就更新最大值
scores = [50, 98, 23, 56, 88, 90, 62]
max1 = scores[0]
for x in scores[1:]:
if x > max1:
max1 = x
print(max1)
min1 = scores[0]
for i in scores[1:]:
if x < min1:
min1 = x
print(min1)
3. sorted
(1) sorted(序列) - 将序列中的元素按照从小到大的方式排序,创建一个新的列表
scores = [50, 98, 23, 56, 88, 90, 62]
result = sorted(scores) # [23, 50, 56, 62, 88, 90, 98]
print(result)
(2) sorted(序列,reverse=True) - 将序列中的元素按照从大到小的方式排序,创建一个新的列表并排序
scores = [50, 98, 23, 56, 88, 90, 62]
result = sorted(scores, reverse=True)
print(result)
4. len
len (序列) - 统计序列中元素的个数
print(len(scores)) # 7
print(len('abd1533')) # 7
print(len(range(2, 5))) # 3
5.list
list(序列) - 将指定的序列转换成列表(任何序列都可以转换成列表,转换的时候直接将序列中的元素作为列表中的元素)
result = list('abs1566')
print(result) # ['a', 'b', 's', '1', '5', '6', '6']
result = list(range(5))
print(result) # [0, 1, 2, 3, 4]
列表的相关操作
1.列表加法运算
列表1 + 列表2 - 将两个列表合并成一个新列表
A = [10, 20, 30]
B = [100, 200]
c = A + B
print(c) # 新的列表不改变原列表
2.列表乘法运算
列表 *N、N * 列表 - 将列表中的元素重复N次产生一个新列表
C = A * 2
print(C)
print(B * 3)
3.列表比较运算
(1) 比较是否相等: ==、!=
print([10, 20, 30] ==[10,20,30]) # True
(2) 比较大小:>、<、>=、<=
# 列表1 > 列表2
# 两个元素比较大小,比较的是第一对不相等的元素的大小(相同位置上的元素是一对)
print([10, 20, 30] > [1, 100, 200, 300, 400]) # True
4. in 和 not in
(1)元素 in 列表 - 判断列表中是否存在指定的元素
(2)元素 not in 列表 - 判断列表中是否不存在指定的元素
print(10 in[10,20,30]) # True
print(10 in [[10,20],30]) # False
print([10,20] in [10,20,30]) # False
# 练习:已经列表A和B, 打印A和B的公共元素
A = ['后羿', '甄姬', '鲁班7号', '赵云']
B = ['小乔', '孙悟空', '猪八戒', '后羿', '盾山', '赵云']
for x in A:
if x in B:
print(x)
列表赋值问题
补充:python中的变量保存数据,保存的是数据在内存中的地址(Python中的变量全部都是指针变量)
1. 拷贝和直接赋值
需求:已知一个列表,现在需要创建和原列表一模一样的新的列表
nums = [10, 20, 30, 40]
# 1)直接赋值 - 一个变量直接给另外一个变量赋值,赋的是地址,赋值后两个变量指向的是同一块内存
nums2 = nums
print('nums:', nums)
print('nums2:', nums2) # [10, 20, 30, 40]
# 2)拷贝
# 一个变量通过拷贝的方式给另外一个变量赋值,赋值的时候会先复制原来变量中的数据,创建一个新的数据,然后将新的数据对应的内存地址给新的变量
nums3 = nums*1
print('nums3:', nums3) # [10, 20, 30, 40]
nums4 = nums + []
print('nums4:', nums4) # [10, 20, 30, 40]
nums5 = nums[:]
print('nums5:', nums5) # [10, 20, 30, 40]
nums6 = nums.copy()
print('nums6:', nums6) # [10, 20, 30, 40]
print('---------------------------------------修改后------------------------------------')
nums.append(100)
print('nums:', nums) # [10, 20, 30, 40, 100]
print('nums2:', nums2) # [10, 20, 30, 40, 100]
print('nums3:', nums3) # [10, 20, 30, 40]
print('nums4:', nums4) # [10, 20, 30, 40]
print('nums5:', nums5) # [10, 20, 30, 40]
print('nums6:', nums6) # [10, 20, 30, 40]
列表推导式:快速创建列表的表达式(代码简洁)
1.列表推导式结构1
(1) 语法:
[表达式 for 变量 in 序列]
(2) 让变量去序列中取值,一个一个的取,取完为止,每取一个值就计算一次表达式的结果,并且将计算结果作为列表的一个元素
result = [10 for x in range(5)]
print(result) # [10, 10, 10, 10, 10]
result = [x*2 for x in range(5)]
print(result) # [0, 2, 4, 6, 8]
# 案例1:将nums中所有元素乘以2
nums = [10, 23, 89, 67]
result = [x*2 for x in nums]
print(result)
# 案例2:将nums中所有元素的个位数
nums = [103, 230, 9, 67]
result = [x % 10 for x in nums]
print(result)
2.列表推导式结构2
(1)语法:
[表达式 for 变量 in 序列 if 条件语句]
(2)让变量去序列中取值,一个一个的取,取完为止,每取一个值就判断一次条件是否成立,如果成立就计算表达式值作为列表的元素
result = [x * 2 for x in range(5) if x % 2 == 0]
print(result) # [0,4,8]
# 案例1:删除scores中所有不及格的分数
scores = [80, 99, 23, 97, 56, 82, 76, 45]
result = [x for x in scores if x >= 60]
print(result)
# 案例2:提取nums中所有奇数的个位数
nums = [103, 230, 89, 67, 78]
result = [x % 10 for x in nums if x % 2 !=0]
print(result)