python数据容器
·
数据容器能大幅简化代码、提升效率,尤其是处理动态数据、快速查找、优先级处理等场景,在Python中无需复杂框架,核心高频实用的 4 种数据容器即可覆盖绝大多数场景:List(列表 / 动态数组)、Set(无序不重复集合)、Dict(字典 / 键值对映射)、deque(双端队列)。
同时为满足复习需要, 也添加了字符串(str)和元组(tuple)的有关知识点.
1. list(列表 / 动态数组)
- 核心作用:替代普通固定长度数组,解决数组长度不可变的问题,竞赛中处理动态增长的列表(比如存储输入数据、结果集、临时缓存)。
- 优势:随机访问快(O (1)),尾部增删元素快(O (1)),支持索引操作,适合需要频繁读取、尾部修改的场景。
- 核心语法:
# 1. 初始化
lst = [] # 空列表
lst = list()
lst2 = [1, 2, 3] # 带初始值
# 2. 增:添加元素(尾部/指定位置)
lst.append(5) # 尾部添加:[5]
lst.insert(0, 3) # 索引0添加:[3,5]
lst.extend(lst2) # 批量添加:[3,5,1,2,3]
# 3. 删:按索引/元素删除
lst.pop(1) # 删除索引1的元素(返回值):[3,1,2,3]
lst.remove(3) # 删除第一个值为3的元素:[1,2,3]
# 4. 查:按索引/判断存在
val = lst[1] # 获取索引1的元素:2
has5 = 5 in lst # 判断是否包含5:False
index = lst.index(2) # 找元素2的第一个索引:1
# 5. 改:修改指定索引元素
lst[0] = 10 # [10,2,3]
# 6. 遍历(竞赛常用两种方式)
# 方式1:普通for(需要索引时用)
for i in range(len(lst)):
print(lst[i], end=" ")
# 方式2:增强for(仅遍历)
for num in lst:
print(num, end=" ")
# 7. 竞赛高频操作:排序、反转、清空
lst.sort() # 升序排序:[2,3,10]
lst.reverse() # 反转:[10,3,2]
lst.clear() # 清空列表
2. set(无序不重复集合)
- 核心作用:快速去重、快速判断元素是否存在(O (1)),竞赛中常用于 “判重”“统计唯一元素” 场景(比如:判断数组是否有重复元素、找两个数组的交集)。
- 核心特点:无序、无重复、不支持索引,底层是哈希表,支持集合运算(交集、并集、差集)。
- 核心语法:
# 1. 初始化
s = set()
s2 = {1, 2, 3} # 带初始值(注意:{}是空字典,不是空集合)
# 2. 增:添加元素(重复元素自动忽略)
s.add(1)
s.add(2)
s.add(1) # 重复,不会添加
# 3. 删:删除元素
s.remove(2) # 删除值为2的元素(元素不存在会报错)
s.discard(3) # 删除值为3的元素(元素不存在不报错,竞赛更常用)
# 4. 查:判断元素是否存在(竞赛最常用)
has1 = 1 in s # True
has3 = 3 in s # False
# 5. 遍历(无索引,只能普通for)
for num in s:
print(num, end=" ") # 输出1
# 6. 竞赛高频:转列表/集合运算
lst = list(s) # 转列表
arr = tuple(s) # 转元组
# 集合运算(找交集/并集/差集)
s1 = {1,2,3}
s2 = {2,3,4}
intersection = s1 & s2 # 交集 {2,3}
union = s1 | s2 # 并集 {1,2,3,4}
difference = s1 - s2 # 差集 {1}
# 7. 清空/长度
size = len(s) # 1
s.clear()
3. dict(字典 / 键值对映射)
- 核心作用:通过 “键” 快速找 “值”(O (1)),竞赛中常用于 “统计频次”“映射关系”(比如:统计数组中每个元素出现的次数、字符串字符计数)。
- 核心特点:键唯一(必须是不可变类型:字符串 / 数字 / 元组)、值可重复,Python3.7+ 字典有序(按插入顺序)。
- 核心语法:
from collections import defaultdict
# 无 key → 自动创建默认值,无需手动判断
# 初始化时必须指定默认值类型(list/int/set)
dd = defaultdict(int)
d = dict(dd) # 后续也可转化为dict类型
# 1. 初始化:键=字符串,值=出现次数
d = {}
d = dict()
d2 = {"a":1, "b":2}
# 2. 增/改:直接赋值(键存在则改值,不存在则新增)
d["a"] = 1
d["b"] = 2
d["a"] = 3 # 键"a"已存在,值改为3
# 3. 查:get(键不存在返回None/指定默认值,竞赛必用,避免KeyError)
countA = d["a"] # 3(键不存在会报错,慎用)
countC = d.get("c", 0) # 键c不存在,返回默认值0(竞赛首选)
# 4. 判:是否包含键/值
hasKeyA = "a" in d # True
hasValue2 = 2 in d.values() # False
# 5. 删:删除键值对
del d["b"] # 删除键为b的键值对
d.pop("a", None) # 删除键为a的键值对,不存在则返回None
# 6. 遍历(竞赛三种常用方式)
# 方式1:遍历所有键(最常用)
for key in d:
value = d[key]
print(f"{key}:{value}")
# 方式2:遍历键值对(效率更高)
for key, value in d.items():
print(f"{key}:{value}")
# 方式3:仅遍历值
for value in d.values():
print(value)
# 7. 大小/清空
size = len(d) # 0
d.clear()
4. deque(双端队列)
- 核心作用:既可以当栈(后进先出),也可以当队列(先进先出),竞赛中替代列表做栈 / 队列(列表头部操作效率低 O (n),deque 两端操作 O (1)),用于 DFS(栈)、BFS(队列)。
- 优势:两端增删效率极高(O (1)),功能全,是 Python 官方推荐的栈 / 队列实现。
- 核心语法:
# 需要导入collections中的deque
from collections import deque
# 初始化
dq = deque()
# 1. 当队列用(FIFO):尾部加,头部取
dq.append(1) # 尾部添加
dq.append(2)
q_head = dq.popleft() # 取出头部1(列表pop(0)效率低,禁用)
# 2. 当栈用(LIFO):尾部加,尾部取(或头部加/取,效果一致)
dq.append(3) # 尾部添加(等价于栈push)
dq.append(4)
s_top = dq.pop() # 取出尾部4(等价于栈pop)
# 也可头部加/取(和Java Deque栈用法对齐)
dq.appendleft(5) # 头部添加
s_top2 = dq.popleft() # 取出头部5
# 3. 查头部/尾部(不删除)
peek_head = dq[0] # 头部3(直接索引,也可用dq[0])
peek_tail = dq[-1] # 尾部2
# 或用专用方法
peek_head2 = dq[0] # 等价于dq.peek()(Python无peek,直接索引更直观)
peek_tail2 = dq[-1]
5. str(字符串)
- 核心作用:存储文本 / 字符序列,是 Python 最常用的文本处理容器.
- 核心特点:有序可通过索引访问(序列型容器),无法修改
- 核心语法:
# 1. 初始化
s1 = "hello" # 双引号
s2 = 'python' # 单引号
s3 = "" # 空字符串
s3 = str()
s4 = "123abc" # 混合字符
# 2. 索引访问(有序,从0开始)
print(s1[0]) # h
print(s1[-1]) # o(倒数第一个)
# 3. 切片(左闭右开,生成新字符串)
print(s1[1:4]) # ell
print(s1[::2]) # hlo(步长2)
print(s1[::-1]) # olleh(反转字符串)
# 4. 遍历
for char in s1:
print(char, end=" ") # h e l l o
# 5. 高频操作(重点!)
# 拼接
new_s = s1 + " " + s2 # hello python
# 统计/查找
print(s1.count("l")) # 2
print(s1.find("e")) # 1(返回索引,不存在返回-1)
print("e" in s1) # True
# 前后缀判断
print(s1.startswith("h")) # True
print(s1.endswith(("h","o"))) # 支持元组多前后缀 → True
# 替换(生成新字符串,原字符串不变)
print(s1.replace("l", "x")) # hexxo
# 分割/拼接
print("a,b,c".split(",")) # ['a','b','c']
print("-".join(["a","b"]))# a-b
# 大小写
print(s1.upper()) # HELLO
print(s1.lower()) # hello
# 去掉首尾空格/换行/制表符
s.strip()
# 判断
print("123".isdigit()) # True(是否纯数字)
print(s1.isalpha()) # True(是否纯字母)
# 6. 长度
print(len(s1)) # 5
6. tuple(元组)
- 核心作用:不可变的列表,用于保护数据不被修改、函数多返回值、作为字典的键。
- 核心特点:有序可通过索引访问(序列型容器),无法修改
- 核心语法:
# 1. 初始化
t1 = (1, 2, 3) # 标准元组
t2 = 1, 2, 3 # 省略括号,效果一样
t3 = () # 空元组
t3 = tuple()
t4 = (10,) # 单元素元组(必须加逗号!)
t5 = (1, "abc", [2, 3]) # 存储不同类型数据
# 2. 索引/切片(和列表、字符串完全一致)
print(t1[0]) # 1
print(t1[1:]) # (2, 3)
# 3. 遍历
for num in t1:
print(num, end=" ") # 1 2 3
# 4. 高频操作
# 判重
print(2 in t1) # True
# 统计/查找
print(t1.count(1)) # 1(元素出现次数)
print(t1.index(2)) # 1(元素索引)
# 元组解包(高频!)
a, b, c = t1
print(a, b, c) # 1 2 3
# 列表 ↔ 元组
lst = list(t1) # [1,2,3]
new_t = tuple(lst) # (1,2,3)
# 5. 长度
print(len(t1)) # 3
# ⚠️ 重要:元组不可变!以下操作会报错
# t1[0] = 100 # 报错!TypeError
更多推荐

所有评论(0)