python系列之字典:一文掌握键值对的魔法字典

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。

python系列前期章节

  1. python系列之注释与变量
  2. python系列之输入输出语句与数据类型
  3. python系列之运算符
  4. python系列之控制流程语句
  5. python系列之字符串
  6. python系列之列表
  7. python系列之元组

一、字典是什么?为什么需要它?

1、概述

生活场景:想象一本真实的字典——通过“字”快速查找到对应的“解释”。在Python中,字典(dict)就是这样的键值对集合,用{ }包裹,能通过键(Key)快速找到对应的值(Value);键是唯一的

2、对比其他数据结构

  • 列表:按顺序存储,查找元素需要遍历
  • 字典:无需顺序,通过唯一键快速定位(速度提升100倍以上!)

二、字典的创建与基础操作

1. 创建字典的3种方式

# 方式1:直接赋值
student = {"name": "小明", "age": 18, "score": 95}

# 方式2:dict()构造函数
teacher = dict(name="王老师", subject="数学", years=5)

# 方式3:从键值对列表转换(适合动态生成)
items = [("city", "北京"), ("area", 16410)]
city_info = dict(items)

2. 键的唯一性

字典中的键是唯一的,就像现实生活中的身份证。如果键名重复了,那么就会被覆盖掉。

dict8 = {'name': 'jack', 'age': 12, 'age': 15}
print(dict8)

运行如下:
键的唯一性

3. 核心操作四件套

操作代码示例说明
通过键获取值student["name"]返回"小明",键不存在则报错
安全获取值student.get("height", 175)键不存在返回设置的默认值175
添加/修改值student["gender"] = "男"新增性别字段
删除键值del student["score"]删除成绩字段

实操代码:

dict2 = {'name': 'zhangsan', 'age': 32}
# 新增、修改和删除
dict2['sex'] = '男'
dict2['age'] = 26 # 直接覆盖

# 删除
# del dict2['name']
dict2.pop("name")
# dict2.clear()

print(dict2)

# 查询
if 'sex' in dict2:
    print(dict2['sex'])

dict2.get('name','未定义')

# 字典中的一些函数
# 创建一个新字典,可以指定键创建,且每一个键的值是None。
new_dict = dict2.fromkeys(['aa','sex'])
print(new_dict)

# 遍历
# items把所有的项都放在一个列表中
for k,v in dict2.items():
    print(f'key={k},value={v}')

运行结果:
运行结果

三、实际场景中的高频应用

场景1:用户信息管理系统

# 用户注册功能
user_db = {}

def register(username, password):
    if username in user_db:  # 快速检查用户名是否存在
        print("用户名已存在!")
    else:
        user_db[username] = {
            "password": password,
            "login_count": 0,
            "last_login": None
        }
        print("注册成功!")

register("Alice", "123456")
print(user_db)
# 输出:{'Alice': {'password': '123456', 'login_count': 0, 'last_login': None}}

运行结果:
运行结果

场景2:电商商品数据统计

# 统计商品销量
sales_data = {
    "iPhone15": {"price": 6999, "sales": 120},
    "小米14": {"price": 3999, "sales": 300},
    "华为Mate60": {"price": 5999, "sales": 250}
}

# 计算总销售额
total = sum(item["price"] * item["sales"] for item in sales_data.values())
print(f"总销售额:{total}元")

# 更新华为销量
sales_data["华为Mate60"]["sales"] += 50

print("目前销量数据:",sales_data)

运行结果:
运行结果


四、必须掌握的8个进阶技巧

1. 遍历字典的三种姿势

# 定义一个字典
student = {"name": "小明", "age": 18, "gender": '男'}
# 遍历键
for key in student.keys():
    print(key)  # 输出:name, age, gender...

# 遍历值
for value in student.values():
    print(value)  # 输出:小明, 18, 男...

# 遍历键值对(最常用!)
for key, value in student.items():
    print(f"{key}: {value}")

2. 字典推导式(一行代码生成字典)

# 生成字母ASCII码字典
ascii_dict = {char: ord(char) for char in "ABCDEF"}
print(ascii_dict)  # {'A': 65, 'B': 66, ..., 'F': 70}

【说明】ord() 函数,用于返回单个字符的ASCII数值或Unicode数值。这个函数接受一个长度为1的字符串作为参数,如果传入的字符超出了Python定义范围,则会引发TypeError异常

3. 合并两个字典

dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged = {**dict1, **dict2}  # 新语法,后者覆盖前者
print(merged)  # {'a': 1, 'b': 3, 'c': 4}

4. 设置默认值(setdefault妙用)

setdefault是字典类型的一个方法,它的作用是如果这个键在字典中不存在的话,在字典中添加一个键值对。如果键已经存在,那么setdefault方法不会改变这个键的值,而是返回这个键当前对应的值。

# 统计单词出现次数
text = "apple banana apple orange banana"
word_counts = {}

for word in text.split():
    word_counts.setdefault(word, 0)
    word_counts[word] += 1

print(word_counts)  # {'apple': 2, 'banana': 2, 'orange': 1}

五、避坑指南(常见错误)

  1. 键必须是不可变类型
    ✅ 允许:字符串、数字、元组
    ❌ 禁止:列表、字典等可变类型作为键

  2. 避免直接修改遍历中的字典

    # 错误示范
    d = {"a":1, "b":2}
    for k in d:
        del d[k]  # 引发RuntimeError
    
    # 正确做法
    for k in list(d.keys()):  # 先转换为列表
        del d[k]
    

六、综合实战:开发简易学生管理系统

students = {}

def add_student():
    sid = input("输入学号:")
    info = {
        "name": input("姓名:"),
        "age": int(input("年龄:")),
        "major": input("专业:")
    }
    students[sid] = info
    print(f"学生{sid}添加成功!")

def query_student():
    sid = input("输入查询学号:")
    student = students.get(sid)
    if student:
        print(f"姓名:{student['name']} 年龄:{student['age']} 专业:{student['major']}")
    else:
        print("查无此人!")

# 使用示例
add_student()
query_student()

运行演示:
运行结果


七、总结与提升

字典优势总结

  • 闪电般的查找速度(O(1)时间复杂度)
  • 灵活的数据结构(支持嵌套、动态增删)
  • 天然适合处理JSON数据(与Web开发完美契合)

提升练习
尝试用字典实现一个通讯录程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值