楼层: 首页/ 软件技术/ Python 基础/ 四大数据结构
3

四大数据结构

list / tuple / dict / set

写程序 80% 的时间在跟数据打交道。Python 内置四样"装数据的容器":列表(有序可变)、元组(有序不可变)、字典(键值对)、集合(不重复)。选对容器,代码短一半;选错了,原地抠脚。

列表 list:有序、可变、什么都能装

fruits = ["苹果", "香蕉", "橙子"] # 增删改查 fruits.append("葡萄") # 末尾追加 → ['苹果','香蕉','橙子','葡萄'] fruits.insert(0, "西瓜") # 插到第0个位置 fruits[1] = "香梨" # 改第二个 del fruits[0] # 删除第一个 fruits.remove("香梨") # 按值删除(删第一个匹配的) # 切片:跟字符串一样 nums = [0,1,2,3,4,5] print(nums[1:4]) # [1, 2, 3] # 列表推导式:一行搞定"把每个元素加工一遍" squares = [x*x for x in range(5)] print(squares) # [0, 1, 4, 9, 16] # 带筛选的推导式:只要偶数 evens = [x for x in range(10) if x % 2 == 0] print(evens) # [0, 2, 4, 6, 8] # 排序 nums.sort() # 原地升序 nums.sort(reverse=True) # 降序 names = ["Bob", "alice", "Charlie"] names.sort(key=lambda s: s.lower()) # 不区分大小写排序

元组 tuple:写死了,改不了

point = (3, 4) # 用小括号 # point[0] = 5 # 这行会报错!元组不能改 # 解包:一口气把元组拆开赋给多个变量 x, y = point print(x, y) # 3 4 # 交换两个变量,Python 一行搞定,不用临时变量 a, b = 1, 2 a, b = b, a print(a, b) # 2 1 # 什么时候用元组?返回多个值、坐标、不该被改的常量 def min_max(lst): return min(lst), max(lst) # 其实返回的是个元组 lo, hi = min_max([3,1,4,1,5]) print(lo, hi) # 1 5

字典 dict:键值对,按名字存东西

user = { "name": "小明", "age": 18, "tags": ["学霸", "篮球"] } # 增删改查 print(user["name"]) # 小明 user["age"] = 19 # 改 user["city"] = "南京" # 加新键 del user["tags"] # 删 # .get 比 [] 安全:键不存在时返回 None 而不是报错 print(user.get("phone")) # None(不会崩) print(user.get("phone", "未填写")) # 未填写 # 遍历 for key, value in user.items(): print(f"{key} = {value}") # 字典推导式 word = "abc" char_count = {c: ord(c) for c in word} print(char_count) # {'a': 97, 'b': 98, 'c': 99} # defaultdict:不用判断"键存不存在",自动给默认值 from collections import defaultdict groups = defaultdict(list) for name in ["张三", "李四", "王二小"]: groups[len(name)].append(name) # 按键的长度分组 print(dict(groups)) # {2: ['张三', '李四'], 3: ['王二小']}

Enum:别用裸字符串当状态码

from enum import Enum class OrderStatus(Enum): PENDING = "待付款" PAID = "已付款" SHIPPED = "已发货" status = OrderStatus.PAID print(status.value) # 已付款 # 比写 if s == "已付款" 稳:拼错了会立刻报错,不会悄悄跑错分支

集合 set:自动去重,交并差

a = {1, 2, 3, 3, 3} # 大括号,但没键值对就是集合 print(a) # {1, 2, 3} 自动去重 b = {3, 4, 5} print(a & b) # {3} 交集 print(a | b) # {1,2,3,4,5} 并集 print(a - b) # {1, 2} a 有 b 没有的 # 最常见用途:列表去重 lst = [1, 2, 2, 3, 3, 3] unique = list(set(lst)) print(unique) # [1, 2, 3] 顺序可能变

选哪个?一张表说清

结构一句话定位典型场景
list有序、可改、允许重复一批待办、一个队列、读出来的 CSV 行。
tuple有序、不可改坐标、函数多返回值、当字典键。
dict键查值、很快用户信息、计数器、查找表。
set不重复、查得快去重、判断在不在、交并差。