Appearance
03|数据结构
巡检脚本要处理一批服务器的信息。每台服务器有名字、IP、状态,还需要按名称快速查找、按状态筛选、去重。单个变量存不下这些数据,需要把多个值组织在一起的数据结构。
Python 最常用的四种:列表(有序序列)、字典(键值映射)、元组(不可变序列)、集合(去重)。
一、列表
列表是有序序列,元素可以增删改。
python
services = ["nginx", "mysql", "redis"]
services[0] # 'nginx',索引从 0 开始
services[-1] # 'redis',负数表示倒数
services.append("etcd") # 末尾添加
services.insert(1, "mongo") # 在索引 1 处插入
services.remove("mysql") # 删除第一个匹配项
popped = services.pop() # 删除并返回最后一个切片:
python
services = ["nginx", "mysql", "redis", "etcd", "mongo"]
services[1:3] # ['mysql', 'redis'],左闭右开
services[:2] # ['nginx', 'mysql'],从头开始
services[2:] # ['redis', 'etcd', 'mongo'],到末尾
services[-2:] # ['etcd', 'mongo'],最后两个列表推导式——从旧列表生成新列表:
python
names = ["web01", "web02", "db01"]
upper_names = [n.upper() for n in names]
# ['WEB01', 'WEB02', 'DB01']
# 带条件筛选
long_names = [n for n in names if len(n) > 4]
# ['web01', 'web02', 'db01']推导式适合简单转换。逻辑一复杂,写成普通 for 循环更清楚。
二、字典
字典是键值对集合,按键查找。
python
host = {
"name": "web01",
"ip": "192.168.10.11",
"role": "web",
}
host["name"] # 'web01'
host.get("status", "ok") # 键不存在时返回默认值 'ok'增删改:
python
host["status"] = "warning" # 添加或修改
host.pop("role") # 删除并返回值
"ip" in host # True,判断键是否存在遍历:
python
for key, value in host.items():
print(f"{key}: {value}")字典推导式:
python
hosts = ["web01", "web02", "db01"]
host_map = {h: f"192.168.10.{i+1}" for i, h in enumerate(hosts)}
# {'web01': '192.168.10.1', 'web02': '192.168.10.2', 'db01': '192.168.10.3'}三、元组
元组和列表类似,但创建后不能修改。
python
point = (192, 168, 1, 1)
point[0] # 192
# point[0] = 10 # 报错:TypeError元组适合表示"不应该被改动的数据",比如坐标、配置项、函数返回的多个值。元组比列表轻量,迭代速度稍快。
打包和解包:
python
# 函数返回多个值,本质是返回元组
def get_host():
return "web01", "192.168.1.1"
name, ip = get_host() # 解包四、集合
集合是无序、不重复的元素集合。
python
tags = {"python", "go", "python", "shell"}
print(tags) # {'python', 'go', 'shell'},自动去重集合运算:
python
a = {"nginx", "mysql", "redis"}
b = {"mysql", "redis", "etcd"}
a & b # {'mysql', 'redis'},交集
a | b # {'nginx', 'mysql', 'redis', 'etcd'},并集
a - b # {'nginx'},差集去重是集合最常见的用途:
python
log_lines = ["error A", "error B", "error A", "error C"]
unique_errors = set(log_lines)
# {'error A', 'error B', 'error C'}五、嵌套结构
实际数据往往是嵌套的:
python
hosts = [
{"name": "web01", "ip": "192.168.10.11", "services": ["nginx", "php"]},
{"name": "db01", "ip": "192.168.10.12", "services": ["mysql"]},
]
# 访问嵌套字段
hosts[0]["services"][0] # 'nginx'
# 遍历
for h in hosts:
print(f"{h['name']}: {', '.join(h['services'])}")json.loads 解析 JSON 后,得到的就是这类嵌套的字典和列表结构。处理 API 响应、配置文件时经常遇到。
记忆锚点:列表有序可改,[];字典按键查找,{} 键值对;元组不可变,();集合去重,无序;嵌套结构用索引和键逐层访问;推导式适合简单转换,复杂逻辑用普通循环。