学完列表和元组,你已经会往“购物车”里装东西了。但有一个问题始终绕不过去——光有购物车还不够,你得知道每个东西叫啥。

列表存东西是按顺序排队的:第 0 个是谁,第 1 个是谁……但你想找一个特定的东西,得从头翻到尾,效率太低。

那有没有一种数据结构,不按顺序,而是按名字存东西?就像你去学校门口取快递,不是在一堆快递里挨个翻,而是直接报取件码——快递员“嗖”地一下就把你的包裹递过来了。

这就是今天的主角——字典(dict)

字典里存的是“键值对”(key-value pair),每个“钥匙”对应一个“值”,找到钥匙就能拿到对应的东西。存的时候靠钥匙,取的时候也靠钥匙,跟现实世界里查字典、查通讯录一模一样。

学完字典,我们再来看看它的“好兄弟”——JSON。你平时调接口、前后端传数据、存配置文件,到处都有 JSON 的影子。Python 的字典和 JSON 长得几乎一样,互相转换只需要两行代码。

这一篇分两大块:第一章,字典的十八般武艺第二章,字典和 JSON 的无缝切换

开整!🔑

一、字典 —— 带标签的储物柜

1.1 字典长啥样?

字典用花括号 {} 表示,里面存的是 键值对(key: value),键和值用冒号 : 隔开,每组用逗号隔开:

python

# 空字典
empty = {}
print(type(empty))   # <class 'dict'>

# 存学生信息
student = {
    "name": "王小明",
    "age": 18,
    "score": 95.5,
    "is_graduated": False
}
print(student)

📌 键一般是字符串,也可以是数字或元组;值可以是任何类型——字符串、数字、列表、另一个字典,随便装。就像一个带标签的储物柜,每个格子贴了个名字,你想存啥就存啥。

1.2 怎么取数据?报“键”名就行了!

python

student = {"name": "王小明", "age": 18, "score": 95.5}

print(student["name"])    # 王小明
print(student["age"])     # 18
# print(student["phone"])  # ❌ 键不存在,报 KeyError!

⚠️ 如果用 [] 取一个不存在的键,程序直接崩溃。所以取之前最好先确认一下。

1.3 更安全的方式:get() —— 找不到就返回 None

python

student = {"name": "王小明", "age": 18}

print(student.get("name"))        # 王小明
print(student.get("phone"))       # None(不报错!)
print(student.get("phone", "未填写"))  # 未填写(自定义默认值)

💡 [] 是“硬取”,没有就报错;get() 是“软取”,没有就给你 None 或者你指定的默认值。

1.4 怎么改数据?直接赋值!

python

student = {"name": "王小明", "age": 18}

# 改已有的
student["age"] = 19
print(student)   # {'name': '王小明', 'age': 19}

# 加新的(直接给不存在的键赋值,就自动添加了)
student["phone"] = "13800138000"
print(student)   # {'name': '王小明', 'age': 19, 'phone': '13800138000'}

1.5 怎么删数据?

方法 作用
pop(键) 删除指定键,返回对应的值
popitem() 删除最后一个键值对,返回 (键, 值)
clear() 清空整个字典

python

student = {"name": "王小明", "age": 18, "score": 95.5, "phone": "13800138000"}

# 删除指定键
phone = student.pop("phone")
print(phone)      # 13800138000
print(student)    # {'name': '王小明', 'age': 18, 'score': 95.5}

# 删除最后一个
last = student.popitem()
print(last)       # ('score', 95.5)
print(student)    # {'name': '王小明', 'age': 18}

# 清空
student.clear()
print(student)    # {}

1.6 怎么遍历字典?

python

student = {"name": "王小明", "age": 18, "score": 95.5}

# 遍历所有键(默认)
for key in student:
    print(key, student[key])

# 遍历所有键值对
for key, value in student.items():
    print(key, "→", value)

# 只遍历键
for key in student.keys():
    print(key)

# 只遍历值
for value in student.values():
    print(value)

1.7 几个常用方法

方法 作用
keys() 返回所有键
values() 返回所有值
items() 返回所有键值对
update(另一个字典) 合并另一个字典到当前字典

python

student = {"name": "王小明", "age": 18}
extra = {"score": 95.5, "phone": "13800138000"}

student.update(extra)
print(student)   # {'name': '王小明', 'age': 18, 'score': 95.5, 'phone': '13800138000'}

1.8 字典实战:统计字符出现次数

python

text = "hello world"
count = {}

for ch in text:
    if ch in count:
        count[ch] += 1
    else:
        count[ch] = 1

print(count)   # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

💡 这种“统计某个东西出现次数”的场景,字典是绝对王牌。

1.9 字典 vs 列表:什么时候用哪个?

场景 用啥 原因
存学生信息(姓名、年龄、成绩) 字典 每个字段有名字,容易理解
存全班学生姓名列表 列表 就存一堆名字,不需要标签
统计文字出现次数 字典 字符→次数,天然键值对
按顺序处理数据 列表 有顺序要求,列表更合适

🧠 金句:列表是“排队”,字典是“贴标签”。需要顺序就用列表,需要名字就用字典。

二、JSON —— 字典的“快递兄弟”

2.1 JSON 是啥?

JSON(JavaScript Object Notation) 是一种通用的数据格式,长得和 Python 字典几乎一模一样:

json

{
    "name": "王小明",
    "age": 18,
    "score": 95.5,
    "hobbies": ["篮球", "音乐"],
    "address": {"city": "北京", "district": "海淀"}
}

📌 JSON 就是所有编程语言都能看懂的“公共语言”。你在前端写 JavaScript,后端写 Python,俩人怎么沟通?用 JSON!Python 把字典转成 JSON 字符串发过去,JavaScript 接过来直接解析成对象。

2.2 json.dumps() —— Python 字典 → JSON 字符串

python

import json

student = {
    "name": "王小明",
    "age": 18,
    "score": 95.5,
    "hobbies": ["篮球", "音乐"],
    "is_graduated": False,
    "address": {
        "city": "北京",
        "district": "海淀"
    }
}

# 转成 JSON 字符串
json_str = json.dumps(student, ensure_ascii=False, indent=4)
print(json_str)
print(type(json_str))   # <class 'str'>

输出(格式化后的 JSON 字符串):

json

{
    "name": "王小明",
    "age": 18,
    "score": 95.5,
    "hobbies": ["篮球", "音乐"],
    "is_graduated": false,
    "address": {
        "city": "北京",
        "district": "海淀"
    }
}

⚠️ 注意看:Python 的 True 变成了 JSON 的 trueFalse 变成了 falseNone 变成了 null

2.3 json.loads() —— JSON 字符串 → Python 字典

python

import json

json_str = '{"name": "王小明", "age": 18, "is_graduated": false}'

# 解析成 Python 字典
student = json.loads(json_str)
print(student)        # {'name': '王小明', 'age': 18, 'is_graduated': False}
print(type(student))  # <class 'dict'>
print(student["name"]) # 王小明

💡 前后端交互的核心逻辑就是:后端把字典 dumps() 成 JSON 字符串发给前端,前端解析后展示;前端传回 JSON 字符串,后端 loads() 成字典再处理。

2.4 json.dump() —— 字典 → 直接写入文件

python

import json

student = {"name": "王小明", "age": 18, "score": 95.5}

# 直接写入文件,不用手动转字符串
with open("student.json", "w", encoding="utf-8") as f:
    json.dump(student, f, ensure_ascii=False, indent=4)

打开 student.json

json

{
    "name": "王小明",
    "age": 18,
    "score": 95.5
}

2.5 json.load() —— 从文件直接读取成字典

python

import json

with open("student.json", "r", encoding="utf-8") as f:
    student = json.load(f)

print(student)        # {'name': '王小明', 'age': 18, 'score': 95.5}
print(student["name"]) # 王小明

2.6 一张图总结 JSON 四大方法

方法 输入 输出 场景
json.dumps() Python 字典 JSON 字符串 转成字符串发网络请求
json.loads() JSON 字符串 Python 字典 接收网络响应并解析
json.dump() Python 字典 + 文件对象 写入文件 把字典存成 JSON 文件
json.load() 文件对象 Python 字典 从 JSON 文件读取成字典

🎯 核心要点速记

概念 一句话
字典 键值对存储,用 {},取数据用 dict["键"] 或 dict.get("键")
字典增删 直接赋值 dict["新键"] = 值 就添加,pop(键) 删除
字典遍历 for key, value in dict.items():
JSON 跨语言的通用数据格式,和 Python 字典长得基本一样
dumps/loads 字典 ↔ JSON 字符串(内存中转换)
dump/load 字典 ↔ JSON 文件(读写文件)


总结

今天你解锁了两件新装备:

字典——带标签的储物柜,存东西再也不怕找不到。想存啥、想取啥,喊一声“键”就行,不用从头翻到尾。

JSON——字典的“快递兄弟”,让 Python 和其他任何语言都能无障碍沟通。你写的 Python 字典,dumps() 一下,Java、JavaScript、C++ 都能读;别人发来的 JSON,loads() 一下,直接变成 Python 字典。

你平时用的手机 App,背后就是无数个 JSON 在来回跑——你的个人信息、订单数据、视频推荐列表,全是 JSON 格式在传输。

学完这一篇,我们就可以去调一个真正的 API 接口了:

比如打开lol的网址输入调入所有英雄

python

import requests
url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js?ts=2974219"
res = requests.get(url)
# print(res)
# print(res.json())
# heros = res.json()['heroes']
# print(heros)

将会得到所有关于所有英雄信息,你也可以尝试去修改代码获取其他信息

这种代码,将来你会天天写。而今天,你站在了起点。

慢慢来,我们总有一天会成为开发高手,咱们下期见~ 👋🐍

更多推荐