Python数据类型(四):字典

今天我们来学习字典,在Python中,字典(dictionary)是一系列键值对。键必须是不可变类型(如字符串、数字、元组),且必须是唯一的,而值可以是任意类型。

一、字典的创建

基本语法:字典变量 = { key:value,key1:value1,key2:value2}

python 复制代码
# 方法1: 花括号直接创建
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
print(person)  # {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 方法2: dict()构造函数
student = dict(name='Bob', age=22, major='CS')
print(student)  # {'name': 'Bob', 'age': 22, 'major': 'CS'}

# 方法3: 从键值对列表创建
pairs = [('name', 'Charlie'), ('age', 30), ('city', 'Shanghai')]
person3 = dict(pairs)
print(person3)  # {'name': 'Charlie', 'age': 30, 'city': 'Shanghai'}

# 方法4: 字典推导式
squares = {x: x**2 for x in range(1, 6)}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

二、访问字典元素

字典可以通过 dictionary[key]来访问元素,但通常不建议你这么做,因为当你访问字典中没有的key时就会报错,可以使用dictionary.get(key)方式来访问,如果找不到元素会返回None。

python 复制代码
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 方法1: 方括号访问
print(person['name'])  # Alice
# print(person['gender'])  # KeyError: 'gender' (键不存在会报错)

# 方法2: get()方法(推荐)
print(person.get('name'))      # Alice
print(person.get('gender'))    # None (键不存在返回None)
print(person.get('gender', '未知'))  # 未知 (设置默认值)

# 方法3: setdefault()访问并设置默认值
gender = person.setdefault('gender', 'female')
print(gender)   # female
print(person)   # {'name': 'Alice', 'age': 25, 'city': 'Beijing', 'gender': 'female'}

三、字典元素的增删改

可以单个修改元素,也可以使用update()方法批量修改元素的值。

python 复制代码
# 创建字典
person = {'name': 'Alice', 'age': 25}

# 添加新键值对
person['city'] = 'Beijing'
print(person)  # {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 修改已有键的值
person['age'] = 26
print(person)  # {'name': 'Alice', 'age': 26, 'city': 'Beijing'}

# 批量更新
person.update({'job': 'Engineer', 'salary': 8000})
print(person)  # {'name': 'Alice', 'age': 26, 'city': 'Beijing', 'job': 'Engineer', 'salary': 8000}

删除的方法主要有del、pop()、clear()方法

python 复制代码
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing', 'job': 'Engineer'}

# 方法1: del语句
del person['age']
print(person)  # {'name': 'Alice', 'city': 'Beijing', 'job': 'Engineer'}

# 方法2: pop()删除并返回值
city = person.pop('city')
print(city)    # Beijing
print(person)  # {'name': 'Alice', 'job': 'Engineer'}

# 方法4: clear()清空字典
person.clear()
print(person)  # {}

四、获取所有键值对,仅获取键或值

1.直接获取键值对

python 复制代码
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 获取所有键
keys = person.keys()
print(keys)        # dict_keys(['name', 'age', 'city'])
print(list(keys))  # ['name', 'age', 'city']

# 获取所有值
values = person.values()
print(values)         # dict_values(['Alice', 25, 'Beijing'])
print(list(values))   # ['Alice', 25, 'Beijing']

# 获取所有键值对
items = person.items()
print(items)         # dict_items([('name', 'Alice'), ('age', 25), ('city', 'Beijing')])
print(list(items))   # [('name', 'Alice'), ('age', 25), ('city', 'Beijing')]

2.for循环遍历键值对

python 复制代码
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 遍历所有键值对
for key, value in person.items():
    print(f'{key}:{value}',end=' ') #输出:name:Alice age:25 city:Beijing 
print()

# 遍历所有键
for key in person.keys():
    print(f'{key}',end=' ')  #输出:name age city
print()

# 遍历所有值
for value in person.values():  #输出:Alice 25 Beijing 
    print(f'{value}',end=' ')

3.带条件的遍历

里面使用了字典推导式

python 复制代码
scores = {'张三': 85, '李四': 72, '王五': 90,}

# 找出成绩大于80的学生
top_students = {name: score for name, score in scores.items() if score > 80}
print(top_students)  # {'张三': 85, '王五': 90}

# 遍历时修改值
for name in scores:
    scores[name] = scores[name] + 5  # 每人加5分
print(scores)  # {'张三': 90, '李四': 77, '王五': 95}

五、检查键是否存在

python 复制代码
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 方法1: in操作符
print('name' in person)     # True
print('gender' in person)   # False

# 方法2: keys()方法
print('name' in person.keys())  # True

六、字典长度和拷贝

python 复制代码
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}

# 字典长度
print(len(person))  # 3

# 浅拷贝
person_copy = person.copy()
person_copy['age'] = 30
print(person)       # {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
print(person_copy)  # {'name': 'Alice', 'age': 30, 'city': 'Beijing'}

七、字典推导式

回忆一下列表推导式,字典推导式和列表推导式的差别是:列表是1个变量,字典是2个变量。

基本语法: {key_expression: value_expression for item in iterable if condition}

  • key_expression:value_expression:一个键值对表达式,用于计算新字典中的元素。
  • for item in iterable:循环部分,从可迭代对象中取出每个元素。
  • if condition:可选,过滤条件,只有满足条件的元素才会被处理并放入新列表。
python 复制代码
# 示例1: 创建平方字典
squares = {x: x**2 for x in range(1, 6)}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 示例2: 转换字典键值
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {value: key for key, value in original.items()}
print(inverted)  # {1: 'a', 2: 'b', 3: 'c'}

# 示例3: 过滤字典
scores = {'Alice': 85, 'Bob': 72, 'Charlie': 90, 'David': 65}
passed = {name: score for name, score in scores.items() if score >= 70}
print(passed)  # {'Alice': 85, 'Bob': 72, 'Charlie': 90}

# 示例4: 修改字典值
students = {'Alice': 85, 'Bob': 72, 'Charlie': 90}
adjusted = {name: score+5 for name, score in students.items()}
print(adjusted)  # {'Alice': 90, 'Bob': 77, 'Charlie': 95}

八、嵌套字典

字典中的值还是字典,运用两个索引进行读取。

python 复制代码
# 学生信息嵌套字典
students = {
    'Alice': {
        'age': 20,
        'grades': [85, 92, 78],
        'major': 'CS'
    },
    'Bob': {
        'age': 22,
        'grades': [70, 65, 80],
        'major': 'Math'
    },
    'Charlie': {
        'age': 21,
        'grades': [95, 88, 92],
        'major': 'Physics'
    }
}

# 访问嵌套字典
print(students['Alice']['age'])      # 20
print(students['Bob']['grades'][0])  # 70

# 修改嵌套字典
students['Alice']['grades'].append(90)
print(students['Alice']['grades'])  # [85, 92, 78, 90]

# 添加新学生
students['David'] = {'age': 23, 'grades': [65, 70, 75], 'major': 'Chemistry'}

# 遍历嵌套字典
for name, info in students.items():
    print(f"姓名: {name}")
    print(f"  年龄: {info['age']}")
    print(f"  专业: {info['major']}")
    print(f"  平均分: {sum(info['grades']) / len(info['grades']):.1f}")

九、列表、元组和字典的区别

特性 列表 (List) 元组 (Tuple) 字典 (Dict)
定义 有序的可变序列 有序的不可变序列 无序的键值对集合(Python 3.7+保持插入顺序)
表示方式 方括号 [] 圆括号 () 花括号 {}
可变性 ✅ 可变 ❌ 不可变 ✅ 可变
有序性 ✅ 有序 ✅ 有序 ❌ 无序(但Python 3.7+保持插入顺序)
元素访问 索引(从0开始) 索引(从0开始) 键(key)
元素类型 任意类型 任意类型 键:不可变类型 值:任意类型
重复元素 ✅ 允许 ✅ 允许 键:❌ 不允许 值:✅ 允许
创建方式 list()[] tuple()() dict(){}
内存占用 较小 最小(因为不可变) 较大(哈希表结构)
查找速度 O(n) 线性查找 O(n) 线性查找 O(1) 哈希查找
常用方法 append(), pop(), sort(), reverse() count(), index() keys(), values(), items(), get()
推导式 列表推导式 [x for x in ...] 元组推导式(返回生成器) (x for x in ...) 字典推导式 {k:v for ...}
适用场景 数据集合,需要增删改查 固定数据集合,作为字典键或函数返回值 键值对映射,快速查找
示例 [1, 2, 3, 'a'] (1, 2, 3, 'a') {'a': 1, 'b': 2}
相关推荐
odoo中国3 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
Jelena157795857923 小时前
Java爬虫api接口测试
python
踩坑记录4 小时前
leetcode hot100 3.无重复字符的最长子串 medium 滑动窗口(双指针)
python·leetcode
诸神缄默不语6 小时前
Python处理Word文档完全指南:从基础到进阶
python
海棠AI实验室6 小时前
第四章 项目目录结构:src/、configs/、data/、tests/ 的黄金布局
python·项目目录结构
爱笑的眼睛117 小时前
超越可视化:降维算法组件的深度解析与工程实践
java·人工智能·python·ai
清铎8 小时前
leetcode_day12_滑动窗口_《绝境求生》
python·算法·leetcode·动态规划
ai_top_trends8 小时前
2026 年工作计划 PPT 横评:AI 自动生成的优劣分析
人工智能·python·powerpoint
TDengine (老段)8 小时前
TDengine Python 连接器进阶指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据