菜单

Administrator
发布于 2026-10-16 / 1 阅读
0
0

Python P4:字典——给数据贴标签,按名字取值

Python P4:字典——给数据贴标签,按名字取值

P3 的日志巡检脚本里,我们用 parts[2] 取级别、parts[1] 取时间——靠位置(第几个)拿数据。位置有个毛病:得数,得记,数错了就全错。

字典换了一种思路:不记位置,记名字。info["级别"] 直接拿到级别,一眼就懂。这篇把字典讲透。


一、字典长什么样

server = {"ip": "3.15.231.19", "os": "Debian", "memory": "8G"}
  • 花括号 {} 包起来的是字典(P2 的括号全家桶讲过:括号定类型)

  • 里面是键值对,键: 值,冒号分隔,逗号分隔多对

  • "ip" 是键(key,标签),"3.15.231.19" 是值(value,抽屉里的东西)

想象一台贴了标签的抽屉柜:想拿 IP?不用数第几个抽屉,直接喊"ip"那格。

字典 vs 列表

列表

字典

包裹

[]

{}

取值方式

按位置:parts[1]

按名字:server["ip"]

位置从几开始

0

不用记位置

适合

有顺序的一串东西

有名字的一组属性

日志拆出来的 parts 是列表(顺序固定);一台服务器的配置是字典(ip、系统、内存各有名字)。

二、取值:按键名

server["ip"]      # '3.15.231.19'
server["os"]      # 'Debian'

[] 是取值标记(P3 讲过),跟在字典后面就是"按标签拿"。

注意:server["ip"] 括号里是写死的字符串 "ip";也可以放变量:

key = "ip"
server[key]       # 等于 server["ip"]

括号里放表达式,先算出值再用——key 是 "ip" 时,它就是 server["ip"]。

查不到怎么办:KeyError 和 .get()

server["cpu"]     # KeyError: 'cpu' ——掀桌子报错

字典里没有 cpu 这个键,用 [] 查会报 KeyError。写脚本时配置项可能缺失,不能让程序动不动崩——用 .get():

server.get("cpu")              # None,不报错
server.get("cpu", "未知")       # '未知',自带备胎

.get(键, 备胎):查到返回值,查不到返回备胎(不写备胎就是 None)。查配置、查日志字段,永远用 .get()。

三、增、改、删

server["region"] = "美西"    # 加:没有这个键就新建
server["memory"] = "16G"    # 改:有这个键就覆盖
del server["region"]        # 删:整个键值对拿掉

server["region"] = "美西" 一行两用:键存在就是改,不存在就是加。del 是删除,删完再查就 KeyError 了。

四、字典的特点

  1. 键必须唯一:写两个 "ip",后写的覆盖先写的

  2. 键必须是不可变的东西:字符串、数字可以;列表、字典不能当键(它们会变,标签不能变)

  3. 值随便装:字符串、数字、列表、甚至再套一个字典都行

  4. 可变:随时加、改、删

  5. 查找快:不管多大,按键取值都是一步到位——这就是它叫"字典"的原因,跟查词典一样

嵌套字典:柜子里再套柜子

servers = {
    "web1": {"ip": "1.1.1.1", "os": "Debian"},
    "db1": {"ip": "2.2.2.2", "os": "Ubuntu"},
}

servers["web1"]["ip"]   # '1.1.1.1'

servers["web1"] 拿到内层字典,再 ["ip"] 拿到 IP。多台服务器的配置就这么管。

五、遍历字典

server = {"ip": "3.15.231.19", "os": "Debian", "memory": "8G"}

for key in server:
    print(key, server[key])

输出:

ip 3.15.231.19
os Debian
memory 8G

for 直接遍历字典,默认只抓键。值要自己查:server[key]。

三兄弟,想抓什么点什么:

list(server.keys())    # ['ip', 'os', 'memory'],只看标签
list(server.values())  # ['3.15.231.19', 'Debian', '8G'],只看值
list(server.items())   # [('ip', '3.15.231.19'), ...],键值对

最顺手的写法——.items() 一次抓一对:

for key, value in server.items():
    print(key, value)

for key, value in 左右手各接一个,一轮就齐,不用再查一遍。

in 也能查键

"ip" in server       # True
"cpu" in server      # False

"x" in 字典 查的是键在不在。配合 if 做配置检查:

if "ip" in server:
    print(f"准备连接 {server['ip']}")

六、综合实战:函数返回字典

P2 的 parse_log 返回的是一句话,调用者还得再拆。改成返回字典,调用者直接按名字取:

def parse_log(log):
    parts = log.split()
    return {"date": parts[0], "time": parts[1], "level": parts[2]}

info = parse_log("2026-10-14 10:23:45 ERROR /var/log disk full")
print(info["level"])   # ERROR
print(info["time"])    # 10:23:45

函数吐出结构化数据,调用者按名字取——这是脚本里最常见的配合。函数本身 P5 细讲。

再进一步,批量解析:

logs = [
    "2026-10-14 10:23:45 INFO 服务启动",
    "2026-10-14 10:24:01 ERROR 磁盘满了",
    "2026-10-14 10:25:10 ERROR 连接超时",
]

for log in logs:
    info = parse_log(log)
    if info["level"] == "ERROR":
        print(f"[{info['time']}] {log}")

for 遍历 → 函数解析成字典 → if 按级别筛选。P2+P3+P4 在这里会师。

七、排错小技巧:repr 看真相

手机上写代码如果遇到中文键值对不上,先别怀疑 Python:

print(repr(server))

repr() 把字符串的真实面目打印出来,空格、看不见的字符都现形。显示乱了数据未必乱,先看真相再下结论。


小结

知识点

一句话

字典形状

{"键": "值"},冒号分隔键值,逗号分隔多对

取值

server["ip"] 按名字取,不用记位置

.get()

查不到不报错,可带备胎,查配置专用

增改删

d[k] = v 增/改,del d[k] 删

键的要求

唯一、不可变(字符串/数字)

遍历

for 默认只抓键;.keys()/.values()/.items() 三兄弟

in

查键在不在

嵌套

字典里套字典,servers["web1"]["ip"]

下一课 P5:函数——def、调用、参数、return,一次讲透。


评论