Skip to content

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 响应、配置文件时经常遇到。

记忆锚点:列表有序可改,[];字典按键查找,{} 键值对;元组不可变,();集合去重,无序;嵌套结构用索引和键逐层访问;推导式适合简单转换,复杂逻辑用普通循环。