Python 字典 (Dictionary) 详解

文章目录

字典

字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力。

1.基本特性

  • 键值对集合:存储数据形式为 key: value 对
  • 无序性:Python 3.7+ 开始保持插入顺序(实现细节,应视为无序)
  • 可变性:可以动态添加、修改、删除键值对
  • 键的唯一性:每个键必须是唯一的
  • 键的可哈希性:键必须是不可变类型(如字符串、数字、元组等)
  • 高效查找:基于哈希表实现,查找时间复杂度接近 O(1)

2.创建字典

python 复制代码
# 使用花括号(最常用)
d1 = {'name': 'Alice', 'age': 25}

# 使用 dict() 构造函数
d2 = dict(name='Bob', age=30)  # 键作为关键字参数
d3 = dict([('name', 'Charlie'), ('age', 35)])  # 从键值对序列

# 字典推导式
d4 = {x: x**2 for x in range(5)}  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# fromkeys 方法 - 为多个键设置相同的默认值
keys = ['a', 'b', 'c']
d5 = dict.fromkeys(keys, 0)  # {'a': 0, 'b': 0, 'c': 0}

# 空字典
empty_dict = {}
empty_dict2 = dict()

3.访问元素

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

# 通过键访问
print(person['name'])  # 'Alice'

# 使用 get() 方法(避免KeyError)
print(person.get('age'))      # 25
print(person.get('country'))  # None
print(person.get('country', 'USA'))  # 指定默认值 'USA'

# 检查键是否存在
print('name' in person)     # True
print('country' in person)  # False

# 获取所有键、值、键值对
print(person.keys())    # dict_keys(['name', 'age', 'city'])
print(person.values())  # dict_values(['Alice', 25, 'New York'])
print(person.items())   # dict_items([('name', 'Alice'), ('age', 25), ('city', 'New York')])

4.修改字典

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

# 添加/修改元素
person['city'] = 'New York'  # 添加
person['age'] = 26           # 修改

# update() 方法 - 批量更新
person.update({'age': 27, 'country': 'USA'})

# setdefault() - 如果键不存在则设置默认值
person.setdefault('gender', 'female')  # 返回 'female'
person.setdefault('name', 'Bob')      # 不修改,返回 'Alice'

# 合并字典 (Python 3.9+)
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged = dict1 | dict2  # {'a': 1, 'b': 3, 'c': 4}

5.删除元素

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

# del 语句
del person['age']

# pop() - 删除并返回指定键的值
city = person.pop('city')  # 返回 'New York'

# popitem() - 删除并返回最后插入的键值对 (Python 3.7+)
key, value = person.popitem()  # 可能是任意项(Python 3.7前)

# clear() - 清空字典
person.clear()  # {}

# 注意:删除不存在的键会引发 KeyError

6.字典遍历

python 复制代码
scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78}

# 遍历键
for name in scores:
    print(name)

for name in scores.keys():
    print(name)

# 遍历值
for score in scores.values():
    print(score)

# 遍历键值对
for name, score in scores.items():
    print(f"{name}: {score}")

# 带索引的遍历 (Python 3.7+ 保持插入顺序)
for i, (name, score) in enumerate(scores.items()):
    print(f"{i+1}. {name}: {score}")

7.字典的高级特性

默认字典 (collections.defaultdict)

python 复制代码
from collections import defaultdict

# 为不存在的键提供默认值
word_counts = defaultdict(int)  # 默认值为 int() 即 0
word_counts['apple'] += 1  # 自动初始化为0然后加1

# 复杂默认值
grouped_data = defaultdict(list)
grouped_data['fruits'].append('apple')

有序字典

python 复制代码
from collections import OrderedDict

# 保持元素插入顺序(Python 3.7+ 普通字典也保持顺序)
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3

计数器

python 复制代码
from collections import Counter

# 统计元素出现次数
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
word_counts = Counter(words)
print(word_counts.most_common(2))  # [('apple', 3), ('banana', 2)]

8.字典的视图对象

字典的keys(),values(),items()返回的是视图对象:

python 复制代码
d = {'a': 1, 'b': 2}
keys = d.keys()

# 视图是动态的
d['c'] = 3
print(keys)  # dict_keys(['a', 'b', 'c'])

# 支持集合操作
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
print(d1.keys() & d2.keys())  # {'b'}
print(d1.keys() - d2.keys())  # {'a'}

9.字典与JSON

python 复制代码
import json

# 字典转JSON
person = {'name': 'Alice', 'age': 25}
json_str = json.dumps(person)  # '{"name": "Alice", "age": 25}'

# JSON转字典
person_dict = json.loads(json_str)

10.性能考虑

  1. 查找速度快:接近 O(1) 时间复杂度
  2. 内存占用较大:比列表等结构占用更多内存
  3. 键的选择:
    • 使用简单、不可变对象作为键
    • 避免使用复杂对象作为键
    • 字符串是最常用的键类型

11.适用场景

  1. 存储对象属性或配置信息
  2. 快速查找表
  3. 实现稀疏数据结构
  4. 缓存计算结果(Memoization)
  5. 数据分组和聚合
  6. JSON数据交互

小结

  1. 字典键必须是可哈希的(不可变类型)
    • 允许:字符串、数字、元组(仅包含可哈希元素)
    • 不允许:列表、字典、集合等可变类型
  2. 比较操作:
    • == 比较键值对内容
    • != 判断是否不相等
    • 没有 <, > 等比较操作
  3. 字典在Python 3.6及之前是无序的,3.7+开始保持插入顺序(作为实现细节,3.7正式成为语言特性)

字典是Python中最灵活和强大的数据结构之一,熟练掌握字典的使用可以极大提高Python编程效率和代码质量。

相关推荐
AlienZHOU1 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
科技苑1 小时前
Python简单网络爬虫教程
爬虫·python
2501_933670791 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
Patrick在香港4 小时前
Claude Prompt 香港场景:公文里「今日」落在 6 个日历日上,「翌日」锚错了 5 天
python·自然语言处理·正则表达式·claude·数据清洗
我要见SA姐14 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
Captaincc4 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
YsyaaabB4 小时前
Python 数值分析
python
阿洛学长4 小时前
计算机二级 Python 基本操作题(15 分)真题笔记(0101 ~ 1903 全套)
python·pycharm
xcLeigh4 小时前
聊聊国产化替换:好用数据迁移工具KDMS怎么帮咱们搞定评估难
数据库·sql·数据迁移·kes·kdms
Elastic 中国社区官方博客5 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎