核心数据类型与容器
Python 最有代表性的体验之一,就是内置容器足够好用。很多问题不需要自己从零实现复杂结构,先把 list、tuple、dict、set 用顺,效率就会高很多。
先建立一个选择框架
- 有序、可修改、允许重复:
list - 有序、不可修改:
tuple - 键值映射:
dict - 去重、集合运算、快速成员判断:
set
list:最常用的顺序容器
numbers = [1, 2, 3]
numbers.append(4)
numbers[0] = 100
print(numbers[1:3])
常见动作:
append():尾部追加extend():拼接多个元素pop():删除并返回元素sort():原地排序
tuple:更轻、更稳定的固定数据
point = (3, 5)
x, y = point
我一般在这些场景下用元组:
- 函数返回多个值
- 表达一个不会变的结构,例如坐标、颜色、配置项
- 希望这个对象能作为字典键或集合元素
dict:键值映射
user = {"name": "alice", "score": 95}
print(user["name"])
print(user.get("age", 0))
user["city"] = "Chengdu"
我最常用的几个动作:
get():安全取值items():同时遍历键和值keys()/values()update():批量更新
set:去重和成员判断
visited = {"a", "b", "c"}
visited.add("d")
print("a" in visited)
集合特别适合:
- 去重
- 判断某个元素是否出现过
- 并集、交集、差集这类集合运算
更完整的内容可以直接看:
容器推导式
Python 里很多“遍历并生成新结果”的动作,都可以用推导式表达:
squares = [x * x for x in range(5)]
score_map = {name: len(name) for name in ["alice", "bob"]}
unique_lengths = {len(name) for name in ["alice", "bob", "eve"]}
不可变和可变要分清
很多坑都不是语法问题,而是“对象能不能被改”的问题。
- 可变对象:
list、dict、set - 不可变对象:
int、float、str、tuple
如果你把一个列表赋值给另一个变量,得到的是“同一个对象的另一个名字”,不是拷贝。
相关问题可以直接看:
标准库里几个常用补充
除了四大基础容器,下面几个也很值得记住:
collections.deque:双端队列collections.Counter:计数器collections.defaultdict:带默认值的字典heapq:堆
我的使用习惯
- 默认先想
list - 需要通过名字取值时改用
dict - 需要去重或判重时马上想到
set - 需要固定结构时用
tuple