列表
1) 列表长什么样子:
列表是容器型数据类型(序列),将[]作为容器的标志,里面多个元素用逗号隔开: [元素1、元素2、元素3…]
2) 列表的特点:
列表是可变的(元素的个数、值、顺序可变)- 增、删、改; 列表是有序的 – 支持下标操作
3) 列表对元素的要求:
没有要求,不管什么数据都可作为列表的元素(万物皆可列表)
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:
list0 = [] # 空列表
list1 = ['Google', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']
1. 查 – 访问列表中的值
1.1 获取单个元素
语法
:列表[下标]
说明
:列表 – 任何结果是列表的表达式,比如:保存列表的变量、具体的列表值等。
[ ] – 固定写法
下标 – 下标又叫索引,是元素在有序序列中的位置信息。
python中有序序列中每个元素都有2组下标值,分别是:从前往后由0开始递增的下标值;从后往前由-1开始递减的下标值。
注意: 下标不能越界
name1 = ['诸葛亮', '貂蝉', '刘备', '吕布']
print(name1[0],name1[1])
print(name1[-1],name1[-2])
"""
输出结果:
诸葛亮 貂蝉
吕布 刘备
"""
1.2 切片 – 截取列表
语法
:列表[始下标 : 终下标 : 步长]
说明
:始下标 – 下标值(0开始的和-1开始都行); 确定切片的优先范围的起点,可以取到
- 固定写法
终下标 – 下标值(0开始的和-1开始都行);确定切片的有效范围的终点,取不到
步长 – 1)决定切片方向(步长对应的方向必须和开始到结束的方向一致,否则结果为空)
2)获取元素的方式(一个一个取还是跳着取)
注
: 切片的有效范围是: [开始下标, 结束下标)
list = ['Google', 'Runoob', "Zhihu", "Taobao", "Wiki"]
# 从第二位开始(包含)截取到第四位(不包含)
print ("list[1:3]: ", list[1])
# 从第二位开始(包含)截取到倒数第二位(不包含)
print ("list[1:-2]: ", list[1:-2])
"""
输出:
list[1:3]: ['Runoob', 'Zhihu']
list[1:-2]: ['Runoob', 'Zhihu']
"""
list1 = ['王者荣耀', '英雄联盟', '冒险岛', '诛仙', '穿越火线', '部落冲突', '魂斗罗', '地下城', '和平精英']
1.2-1 省略开始下标
语法
:列表[:终下标;步长] / 列表[:终下标]省略开始下标,开始位置由步长决定 – 步长为正,从0下标开始取;步长为负,从-1下标开始取
print(list1[:4]) # ['王者荣耀', '英雄联盟', '冒险岛', '诛仙']
print(list1[:4:-1]) # ['和平精英', '地下城', '魂斗罗', '部落冲突']
'''
输出:
['王者荣耀', '英雄联盟', '冒险岛', '诛仙']
['和平精英', '地下城', '魂斗罗', '部落冲突']
'''
1.2-2 省略结束下标
语法
:列表[始下标::步长] / 列表[始下标:]省略结束下标,结束位置由步长决定 – 步长为正,以最后个元素-1下标结束;步长为负,以第一个元素0下标结束
print(list1[-3::-2]) # ['魂斗罗', '穿越火线', '冒险岛', '王者荣耀']
print(list1[-3:]) # ['魂斗罗', '地下城', '和平精英']
1.2-3 省略始终下标
语法
:列表[::步长] / 列表[:]省略下标,列表全取,开始位置步长决定,步长为正从0下标开始;步长为负从-1下标开始,省略步长,默认为1
print(list1[::-1]) # ['和平精英', '地下城', '魂斗罗', '部落冲突', '穿越火线', '诛仙', '冒险岛', '英雄联盟', '王者荣耀']
print(list1[:]) # ['王者荣耀', '英雄联盟', '冒险岛', '诛仙', '穿越火线', '部落冲突', '魂斗罗', '地下城', '和平精英']
1.3 遍历元素
方式1 – 获取元素
直接获取列表中的每个元素
for 元素 in 列表: 循环体
for i in name1:
print(i,end='\t')
"""
输出:诸葛亮 貂蝉 刘备 吕布
"""
方式2 – 获取下标
先获取到元素下标值,然后通过下标在获取元素
for 下标 in range(len(列表)): 循环体
for j in range(len(name1)):
print(name1[j])
"""
输出:诸葛亮 貂蝉 刘备 吕布
"""
方式3 – 同时获取元素、下标
同时获取列表中每个元素和元素对应的下标
for 下标,元素 in enumerate(列表): 循环体 """ 输出:诸葛亮 貂蝉 刘备 吕布 """
实例
# 练习1: 统计不及格人数
scores = [89, 67, 56, 90, 98, 30, 78, 51, 99]
count = 0
for i in scores:
if i < 60:
count += 1
print("不及格的人有:", count)
# 练习2:统计列表中整数的个数
count0 = 0
list7 = [89, 9.9, 'abc', True, 'abc', '10', 81, 90, 23]
for i in list7:
if type(i) == int:
count0 += 1
print('整数有:', count0)
"""
输出结果:
不及格的人有: 3
整数有: 4
"""
2. 增 – 添加元素
2.1 添加单个元素
语法:
列表.append(元素) – 在列表的最后添加一个元素
列表.insert(下标,元素) – 在指定下标位置前面插入元素
list1 = ['让子弹飞', '邪不压正']
list1.append('无双') # 在列表末端添加
list1.insert(1,'大话西游') # 在下标为1的前面添加
"""
输出结果:
['让子弹飞', '大话西游', '邪不压正', '无双']
"""
2.2 批量添加
语法:
列表1.extend(列表2) – 将列表2元素全部添加到列表1的后面
参数说明:
列表2 – 元素列表,可以是列表、元组、集合、字典,若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。
list1.extend(['触不可及','钢铁侠'])
print(list1)
"""
输出结果:
['让子弹飞', '大话西游', '邪不压正', '无双', '触不可及', '钢铁侠']
"""
实例
# 1. 提取及格的分数 (append使用)
scores = [89, 67, 56, 90, 98, 30, 78, 51, 99]
jige = []
for i in scores:
if i >= 60:
jige.append(i)
jige.sort()
print(jige)
"""
结果:[67, 78, 89, 90, 98, 99]
"""
# 2. 添加其他类型数据到列表 (extend使用)
language = ['French']
# 元组
language_tuple = ('Spanish', 'Portuguese')
# 集合
language_set = {'Chinese', 'Japanese'}
# 添加元组到列表末尾
language.extend(language_tuple)
print('加上元组列表: ', language)
# 添加集合到列表末尾
language.extend(language_set)
print('加上集合新列表: ', language)
"""
输出结果:
新列表: ['French', 'Spanish', 'Portuguese']
新列表: ['French','Spanish', 'Portuguese', 'Chinese', 'Japanese']
"""
3. 删 – 删除列表元素
teleplays = ['琅琊榜', '大秦', '天下第一', '庆余年', '大秦', '亮剑', '西游记']
3.1 del
语法
:del 列表[下标] – 删除列表指定元素注: 下标不能越界
del teleplays[2]
print(teleplays)
# ['琅琊榜', '大秦', '庆余年', '大秦', '亮剑', '西游记']
3.2 remove
语法
:列表.remove[元素] – 删除列表中指定元素的第一个匹配项注: a. 如果元素不存在,会报错
b. 如果列表存在重复值,只删除第一个
teleplays.remove('大秦')
print(teleplays)
# ['琅琊榜', '天下第一', '庆余年', '大秦', '亮剑', '西游记']
3.3 pop
语法
:列表.pop(下标(可省,默认最后一个元素))取出列表中指定下标对应的元素,并且返回该元素的值
del_item = teleplays.pop() # 移除最后一个元素,并保存下元素
del_item1 = teleplays.pop(1) # 移除下标是1的元素,并保存下元素
print(del_item, del_item1, teleplays, sep='\t')
# 西游记 大秦 ['琅琊榜', '天下第一', '庆余年', '大秦', '亮剑']
3.4 clear
语法
:列表.clear() – 清空列表
teleplays.clear()
print(teleplays) # []
练习
# 练习:删除列表中低于60分的成绩
scores = [90, 45, 56, 89, 76, 56, 92, 45, 30, 59, 67, 70]
i = 0
while i < len(scores):
if scores[i] < 60:
del scores[i]
continue
i += 1
print(scores)
4. 改 – 修改元素值
语法
:列表[下标] = 值将列表中指定下标对应的元素改成指定的值
teleplays[1], teleplays[2] = '伪装者', '琅琊榜2风起长林'
print(teleplays)
# ['琅琊榜', '伪装者', '琅琊榜2风起长林', '庆余年', '大秦', '亮剑', '西游记']
练习
# 练习:将低于60分的成绩全部改成0分
scores = [90, 45, 56, 89, 76, 56, 92, 45, 30, 59, 67, 70]
for i in range(len(scores)):
if scores[i] < 60:
scores[i] = 0
print(scores)
5.列表相关操作
5.1 数学运算符: +、*
# 列表1 + 列表2 -- 将列表1和列表2合并成一个新的列表(不改变原来列表)
# 列表1 * N -- 将N个列表1合并成一个新的列表
list1 = [1, 2, 3]
list2 = [6, 5, 4]
print(list1 + list2, list1, list2,sep=' -- ')
print(list1 * 3, list1)
'''
输出:
[1, 2, 3, 6, 5, 4] -- [1, 2, 3] -- [6, 5, 4]
[1, 2, 3, 1, 2, 3, 1, 2, 3] [1, 2, 3]
'''
5.2 比较运算符: ==、!=、>、<、>=、<=
# 1) ==、!=
print(list1 != [1,2,3]) # False
print(list1 == [3, 1, 2]) # False 列表是有序的
print({1,2,3} == {3,2,1}) # True 集合是无序的
# 2) 列表1 >(<、>=、<=) 列表2
# 两个列表比较大小的原理: 比较第一对不相等的元素的大小。(两个列表下标(0开始)相同的元素为一对)
print([1,5,3,4] > [1,2,4,5,6]) # True 第一对相同,比较5和2
5.3 in 和 not in
# 元素 in 列表 - 判断列表中是否有指定元素
# 元素 not in 列表 - 判断列表中是否没有这个元素
print(10 in [20,30,10,50]) # True
print(60 not in [20,30,10,50]) # True
print([10,20] in [[10,20],30,50]) # True
6. 列表相关方法
list1 = [1,2,3,6,9,5,1]
6.1 count – 统计个数
语法
:列表.count(元素) – 统计列表中指定元素的个数
print(list1.count(1)) # 2
6.2 index – 取首次出现下标
语法
:列表.index(元素) – 获取元素第一次出现在列表中的下标
print(list1.index(1)) # 返回下标0
6.3 reverse – 列表反向
语法
:列表.reverse() – 将列表反向逆序, [1,2] 变为 [2,1]
list1.reverse()
print(list1)
# [1, 5, 9, 6, 3, 2, 1]
6.4 sort -排序
语法
:列表.sort(reverse=True(默认是False小到大,可省))将列表元素排序从小到大排序,参数=True表示大到小。
list1.sort() # 升序
print(list1)
list1.sort(reverse=True) # 降序
print(list1)
'''
输出:
[1, 1, 2, 3, 5, 6, 9] # 升序
[9, 6, 5, 3, 2, 1, 1] # 降序
'''
6.5 copy – 复制列表
'''
copy 和 = 的区别:
列表1 = []
使用'=': 列表2 = 列表 -- 相当于列表2指向了列表1,列表2中数据改变了,列表1也会被改变
使用copy: 列表2 = 列表1.copy() -- 给列表1相同的数据给了列表2,都是独立的
'''
课后练习
1.已知一个数字列表,求列表中心元素。
lists = [1, 2, 3, 4, 5, 6, 7, 8, 9]
if len(lists) % 2 == 0:
print('列表总数是偶数,中间2个数是:{}和{}'.format(lists[len(lists)//2-1],lists[len(lists)//2]))
else:
print('列表中心元素是:', lists[len(lists)//2])
2.已知一个数字列表,求所有元素和。
lists = [1, 2, 3, 4, 5, 6, 7, 8, 9]
sum1 = 0
for item in lists:
sum1 += item
print('列表所有元素和:', sum1)
3.已知一个数字列表,输出所有奇数下标元素。
lists = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('列表奇数下标元素:')
for index in range(1, len(lists), 2):
print(lists[index], end='\t')
4.已知一个数字列表,输出所有元素中,值为奇数的元素。
lists = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('列表中奇数的元素有:')
for item in lists:
if item % 2 != 0:
print(item, end='\t')
5.已知一个数字列表,将所有元素乘二。
例如:nums = [1, 2, 3, 4] —> nums = [2, 4, 6, 8]
lists = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for index in range(len(lists)):
lists[index] *= 2
print('列表所有元素乘二后的列表:', lists)
6.有一个长度是10的列表,数组内有10个人名,要求去掉重复的
例如:names = [‘张三’, ‘李四’, ‘大黄’, ‘大黄’, ‘张三’, ‘张三’, ‘张三’] -> names = [‘张三’, ‘李四’, ‘大黄’]
names = ['王五', '小明', '李四', '大黄', '小明', '大黄', '张三', '王五', '张三']
count = len(names) - 1
while count > -1 :
if names.count(names[count]) > 1:
del names[count]
count -= 1
print('删除重复值的列表元素:', names)
# 删除重复值的列表元素: ['王五', '小明', '李四', '大黄', '张三']
7.用一个列表来保存一个节目的所有分数,求平均分数(去掉一个最高分,去掉一个最低分,求最后得分)
lists = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lists.remove(max(lists))
lists.remove(min(lists))
print('节目分数的平均分数是:', sum(lists) / len(lists))
# 节目分数的平均分数是: 5.0
8.有两个列表A和B,使用列表C来获取两个列表中公共的元素
例如: A = [1, ‘a’, 4, 90] B = [‘a’, 8, ‘j’, 1] –> C = [1, ‘a’]
list1 = [11, 22, 32, 4, 55, 62, 9]
list2 = [1, 22, 3, 4, 53, 62, 75, 8, 9, 10]
list3 = []
if len(list1) < len(list2):
for item in list1:
if item in list2:
list3.append(item)
else:
for item in list2:
if item in list1:
list3.append(item)
print('两个列表公共部分元素:', list3)
# 两个列表公共部分元素: [22, 4, 62, 9]
9.有一个数字列表,获取这个列表中的最大值.(注意: 不能使用max函数)
例如: nums = [19, 89, 90, 600, 1] —> 600
nums = [19, 89, 90, 600, 1]
nums.sort()
print('列表中的最大值:', nums[-1])
# 列表中的最大值: 600
10.获取列表中出现次数最多的元素
例如:nums = [1, 2, 3,1,4,2,1,3,7,3,3] —> 打印:3
nums = [1, 2, 3, 1, 4, 2, 1, 3, 7, 3, 3]
count = 0
num1 = []
for item in nums:
if count < nums.count(item):
num1.clear()
count = nums.count(item)
num1.append(item)
elif count == nums.count(item) and item not in num1:
num1.append(item)
print('元素{}出现次数最多,共出现{}次'.format(num1, count))
# 元素[3]出现次数最多,共出现4次