一、数据容器入门
1. 定义
一种可容纳多份数据的Python数据类型,每份数据为元素,元素可以是任意类型(字符串、数字、布尔等)。
2. 分类(按特性划分)
依据是否支持重复元素、是否可修改、是否有序分为5类:
list(列表)、tuple(元组)、str(字符串)、set(集合)、dict(字典)。
3. 核心优势
替代多个独立变量,实现批量存储/使用数据,简洁高效。
二、列表(list)- 可修改、有序、可重复
1. 定义
cpp
# 普通定义
name_list = ['itheima', 'itcast', 'python']
# 多类型+嵌套
my_list = ['itheima', 666, True, [1,2,3]]
# 空列表
empty_list = []
empty_list2 = list()
2. 下标索引
-
正向:从
0开始递增 -
反向:从
-1开始递减 -
嵌套列表:多层下标访问
cpp
my_list = [[1,2,3], [4,5,6]]
print(my_list[0]) # 取内层第一个列表:[1,2,3]
print(my_list[0][0]) # 取内层第一个列表的第一个元素:1
3. 常用方法
| 方法 | 作用 | 代码示例 |
|---|---|---|
append(元素) |
尾部追加元素 | my_list.append(7) |
extend(容器) |
尾部追加另一个容器的所有元素 | my_list.extend([8,9]) |
insert(下标, 元素) |
指定下标插入元素 | my_list.insert(1, 'test') |
del 列表[下标] |
删除指定下标元素 | del my_list[0] |
pop(下标) |
删除指定下标元素并返回该元素 | val = my_list.pop(0) |
remove(元素) |
删除第一个匹配的元素 | my_list.remove(666) |
clear() |
清空列表 | my_list.clear() |
count(元素) |
统计元素出现次数 | num = my_list.count(1) |
index(元素) |
查找元素下标,找不到报错 | idx = my_list.index('itheima') |
len(列表) |
统计元素个数 | l = len(my_list) |
4. 遍历
while循环
cpp
my_list = [1,2,3,4,5]
index = 0
while index < len(my_list):
print(my_list[index])
index += 1
for循环
cpp
my_list = [1,2,3,4,5]
for i in my_list:
print(i)
5. 特点
-
可容纳多个元素(上限
)
-
支持多类型元素、嵌套
-
有序(有下标)、可重复
-
可修改(增/删/改元素)
三、元组(tuple)- 不可修改、有序、可重复
1. 定义
注意:单个元素必须加逗号,否则不是元组类型
cpp
# 普通定义
t1 = (1, "Hello", True)
# 单个元素
t2 = ("Hello",)
# 嵌套元组
t3 = ((1,2,3), (4,5,6))
# 空元组
t4 = ()
t5 = tuple()
2. 常用方法(仅查询/统计,无修改方法)
cpp
t = (1,2,'hello',3,4,'hello')
print(t.index('hello')) # 查找下标:2
print(t.count('hello')) # 统计次数:2
print(len(t)) # 统计个数:6
print(t[2]) # 下标取值:'hello'
3. 特殊修改规则
元组本身不可修改,但内部的列表可以修改(不可替换列表)
cpp
t = (1,2,['itheima','itcast'])
t[2][1] = 'best' # 合法:修改列表内元素,结果:(1,2,['itheima','best'])
# t[2] = [1,2,3] # 非法:替换列表,报错
4. 遍历
同列表(while/for循环均可)
cpp
t = (1,2,3,4,5)
# for循环(推荐)
for i in t:
print(i)
5. 特点
-
与列表几乎一致,唯一区别:不可修改
-
支持多类型、嵌套、有序、可重复
-
适合存储不希望被篡改的数据
四、字符串(str)- 不可修改、有序、字符专属容器
1. 本质
字符的有序容器,每个字符对应下标,仅能存储字符串类型。
2. 下标索引
同列表/元组(正向0开始,反向-1开始)
cpp
s = 'itheima'
print(s[0]) # 'i'
print(s[-1]) # 'a'
3. 常用方法
| 方法 | 作用 | 代码示例 |
|---|---|---|
index(子串) |
查找子串下标,找不到报错 | s.index('the') |
replace(子串1, 子串2) |
替换所有子串1为子串2,返回新字符串 | new_s = s.replace('i', 'I') |
split(分隔符) |
按分隔符分割,返回列表 | lst = s.split('e') |
strip() |
去除首尾空格/换行符 | new_s = s.strip() |
strip(字符) |
去除首尾指定字符(按单个字符匹配) | new_s = '12itheima21'.strip('12') |
count(子串) |
统计子串出现次数 | num = s.count('i') |
len(字符串) |
统计字符个数(中文/数字/符号均算1个) | l = len(s) |
4. 遍历
同列表/元组(while/for循环均可)
cpp
s = '黑马程序员'
for c in s:
print(c)
5. 特点
-
专属字符存储,仅支持字符串类型
-
有序、可重复、不可修改
-
长度无限制(取决于内存)
五、序列切片 - 列表/元组/字符串通用
1. 序列定义
内容连续、有序、支持下标索引的容器:列表、元组、字符串。
2. 切片语法
cpp
序列[起始下标:结束下标:步长]
-
起始下标:留空=从头开始
-
结束下标:留空=截取到结尾(不含结束下标本身 )
-
步长:1=逐个取,N=跳过N-1个,负数=倒序取
3. 示例
cpp
# 列表切片
lst = [1,2,3,4,5]
print(lst[1:4]) # [2,3,4](1到3,步长1)
print(lst[::2]) # [1,3,5](从头到尾,步长2)
print(lst[3:1:-1]) # [4,3](倒序,3到2)
# 字符串切片(倒序常用)
s = '12345'
print(s[::-1]) # '54321'(完全倒序)
# 元组切片
t = (1,2,3,4,5)
print(t[:1:-2]) # (5,3)(倒序,尾到2,步长2)
六、集合(set)- 可修改、无序、不可重复(自动去重)
1. 定义
注意 :空集合必须用set(),{}是空字典
cpp
# 普通定义(自动去重)
s = {'黑马程序员', '传智播客', '黑马程序员'}
# 空集合
empty_s = set()
2. 常用方法(无下标,不可用while遍历)
| 方法 | 作用 | 代码示例 |
|---|---|---|
add(元素) |
添加元素(重复则忽略) | s.add('itheima') |
remove(元素) |
删除元素,不存在报错 | s.remove('传智播客') |
pop() |
随机删除一个元素并返回 | val = s.pop() |
clear() |
清空集合 | s.clear() |
difference(集合2) |
取差集(本集合有,集合2无),返回新集合 | s3 = s1.difference(s2) |
difference_update(集合2) |
本集合删除与集合2的交集,修改原集合 | s1.difference_update(s2) |
union(集合2) |
取并集,返回新集合 | s3 = s1.union(s2) |
len(集合) |
统计元素个数 | l = len(s) |
3. 遍历
仅支持for循环(无序,遍历结果不固定)
cpp
s = {1,2,3,4,5}
for i in s:
print(i)
4. 特点
-
可容纳多类型元素、可修改
-
无序(无下标)、不可重复(自动去重)
-
适合去重、交集/并集/差集计算
七、字典(dict)- 可修改、无序、键值对形式
1. 定义
用{}存储键值对(Key: Value) ,Key不可重复(重复会覆盖),Key不可为字典。
cpp
# 普通定义
stu_score = {'王力鸿':99, '周杰轮':88, '林俊节':77}
# 嵌套字典(值为字典)
stu_info = {
'王力鸿': {'语文':77, '数学':66},
'周杰轮': {'语文':88, '数学':86}
}
# 空字典
empty_dict = {}
empty_dict2 = dict()
2. 取值
通过Key 取值,而非下标
cpp
print(stu_score['王力鸿']) # 99
print(stu_info['王力鸿']['语文']) # 77
3. 常用方法
| 方法 | 作用 | 代码示例 |
|---|---|---|
字典[Key] = Value |
新增/更新键值对(Key不存在=新增,存在=更新) | stu_score['张学油']=66 |
pop(Key) |
删除键值对,返回Value | val = stu_score.pop('王力鸿') |
clear() |
清空字典 | stu_score.clear() |
keys() |
获取所有Key,返回可迭代对象 | keys = stu_score.keys() |
len(字典) |
统计键值对个数 | l = len(stu_score) |
4. 遍历
仅支持for循环,默认遍历Key,可通过Key取Value
cpp
stu_score = {'王力鸿':99, '周杰轮':88, '林俊节':77}
# 遍历Key
for key in stu_score:
print(f'学生:{key},分数:{stu_score[key]}')
# 先取所有Key再遍历(等价上式)
for key in stu_score.keys():
print(f'学生:{key},分数:{stu_score[key]}')
5. 特点
-
存储键值对,通过Key快速检索Value
-
Key唯一、不可为字典,Value可任意类型/嵌套
-
无序(无下标)、可修改
-
适合存储有映射关系的数据(如姓名-成绩、ID-信息)
八、数据容器通用操作
所有5类容器均支持以下操作,部分有专属限制(如集合/字典无下标)。
1. 通用统计
cpp
lst = [1,2,3,4,5]
s = 'itheima'
print(len(lst)) # 统计元素个数:5
print(max(s)) # 取最大元素:'t'(字符串按ASCII码比较)
print(min(lst)) # 取最小元素:1
2. 通用类型转换
cpp
lst = [1,2,3]
t = (4,5,6)
s = '789'
se = {1,2,3}
# 转列表
print(list(t)) # [4,5,6]
# 转元组
print(tuple(lst)) # (1,2,3)
# 转字符串
print(str(lst)) # '[1,2,3]'
# 转集合(自动去重)
print(set(lst)) # {1,2,3}
3. 通用排序
python
# sorted(容器, reverse=True/False),返回排好序的列表
lst = [5,2,9,1]
s = 'bacfe'
print(sorted(lst)) # 升序:[1,2,5,9]
print(sorted(lst, reverse=True)) # 降序:[9,5,2,1]
print(sorted(s)) # 字符串按ASCII排序:['a','b','c','e','f']
4. 通用遍历
-
支持for循环:所有容器均支持
-
支持while循环:仅列表、元组、字符串(有下标);集合、字典不支持(无下标)
九、5类数据容器核心对比
| 特性 | 列表(list) | 元组(tuple) | 字符串(str) | 集合(set) | 字典(dict) |
|---|---|---|---|---|---|
| 元素类型 | 任意 | 任意 | 仅字符 | 任意 | Key:除字典外任意;Value:任意 |
| 下标索引 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 重复元素 | 支持 | 支持 | 支持 | 不支持 | Key不重复,Value可重复 |
| 可修改性 | 支持 | 不支持 | 不支持 | 支持 | 支持 |
| 数据有序 | 是 | 是 | 是 | 否 | 否 |
| 核心使用场景 | 可修改、可重复的批量数据 | 不可修改、可重复的批量数据 | 字符序列存储 | 数据去重、集合运算 | 键值对映射(快速检索) |
十、经典练习代码
1. 列表筛选偶数(while+for双实现)
python
# 原列表
nums = [1,2,3,4,5,6,7,8,9,10]
even_lst = []
# while循环实现
index = 0
while index < len(nums):
if nums[index] % 2 == 0:
even_lst.append(nums[index])
index += 1
print(f'while筛选偶数:{even_lst}')
# for循环实现
even_lst2 = []
for i in nums:
if i % 2 == 0:
even_lst2.append(i)
print(f'for筛选偶数:{even_lst2}')
2. 集合去重
python
my_list = ['黑马程序员', '传智播客', '黑马程序员', 'itcast', 'itcast']
my_set = set()
# 遍历列表添加到集合(自动去重)
for i in my_list:
my_set.add(i)
print(f'去重后集合:{my_set}')
3. 字典升职加薪
python
# 员工信息字典
staff = {
'王力鸿': {'部门':'科技部', '工资':3000, '级别':1},
'周杰轮': {'部门':'市场部', '工资':5000, '级别':2},
'张学油': {'部门':'科技部', '工资':4000, '级别':1}
}
# 遍历所有员工,级别1则升职加薪
for name in staff:
if staff[name]['级别'] == 1:
staff[name]['级别'] += 1
staff[name]['工资'] += 1000
print(f'加薪后信息:{staff}')
4. 序列切片取指定内容
python
# 原字符串:"万过薪月,员序程马黑来,nohtyP学"
s = "万过薪月,员序程马黑来,nohtyP学"
# 步骤1:倒序字符串 → 学Python,来黑马程序员,月薪过万
s_rev = s[::-1]
# 步骤2:切片取"黑马程序员"
result = s_rev[9:14] # 切片不包含最后一个下标
print(f'结果:{result}') # 黑马程序员