Python-什么是字典

153 阅读3分钟

一、前言

在 Python 中,字典(Dictionary) 是一种非常重要的内置数据类型,它以**键值对(Key-Value Pair)**的形式存储数据,是实现高效查找、插入和删除操作的理想选择。

本文将带你从零开始了解 Python 字典的基本概念、特点、创建方式以及常用操作,帮助你快速掌握这一核心数据结构。

二、什么是字典?

1. 定义

字典(dict) 是一种无序、可变的数据结构,用于存储多个“键-值”对(key-value pair),每个键对应一个值。

与列表不同的是:

列表字典
通过索引访问元素通过键(key)访问值
有序无序(Python 3.7+ 保持插入顺序)
元素为单一值元素为键值对

例如:

student = {
    'name': 'Alice',
    'age': 20,
    'major': 'Computer Science'
}

2. 特点总结

特性描述
可变性支持增删改查操作
无序性不保证顺序(但 Python 3.7+ 默认按插入顺序保存)
键唯一每个键必须唯一,重复键会被覆盖
值多样值可以是任意类型,如数字、字符串、列表、对象等
键不可变键必须是不可变类型(如整数、字符串、元组)

三、如何创建字典?

1. 使用花括号 {} 创建字典(最常见)

person = {'name': 'Tom', 'age': 25, 'city': 'Beijing'}
print(person)
# 输出:{'name': 'Tom', 'age': 25, 'city': 'Beijing'}

2. 使用 dict() 构造函数创建

可以通过多种方式构造字典:

(1)键值对作为参数传入

person = dict(name='Jerry', age=30, city='Shanghai')
print(person)  # {'name': 'Jerry', 'age': 30, 'city': 'Shanghai'}

(2)使用列表或元组构造

data = [('name', 'Lucy'), ('age', 22)]
d = dict(data)
print(d)  # {'name': 'Lucy', 'age': 22}

(3)从两个列表 zip 合并生成

keys = ['a', 'b', 'c']
values = [1, 2, 3]
my_dict = dict(zip(keys, values))
print(my_dict)  # {'a': 1, 'b': 2, 'c': 3}

3. 创建空字典

empty_dict = {}
another_empty = dict()

四、字典中的键和值要求

✅ 合法的键类型(必须是不可变类型):

  • 整数(int)
  • 浮点数(float)
  • 字符串(str)
  • 布尔值(True/False)
  • 元组(tuple)

❌ 非法的键类型(不可哈希,不能作为键):

  • 列表(list)
  • 字典(dict)
  • 集合(set)

例如:

# 合法
d = {(1, 2): 'point'}

# 非法,会报错:TypeError: unhashable type: 'list'
# d = {[1, 2]: 'point'}

五、字典的嵌套结构

字典可以嵌套其他字典、列表、元组等复杂结构,非常适合表示层级关系。

示例:学生信息字典嵌套

students = {
    '001': {
        'name': 'Alice',
        'scores': {'math': 90, 'english': 85}
    },
    '002': {
        'name': 'Bob',
        'scores': {'math': 78, 'english': 92}
    }
}

# 访问 Bob 的英语成绩
print(students['002']['scores']['english'])  # 92

六、为什么使用字典?

场景适用原因
存储配置项如数据库连接信息、用户设置等
表达对象属性如用户信息、商品详情等
快速查找字典的查找时间复杂度接近 O(1)
JSON 数据处理Python 字典与 JSON 格式高度兼容
函数参数传递可用字典解包传递关键字参数

七、小结:字典 vs 列表

对比项列表字典
是否有序✅ 是(默认)⚠️ 无序(3.7+ 保持顺序)
存取方式索引
是否允许重复✅ 是❌ 否
是否可变✅ 是✅ 是
查找效率O(n)O(1)
适用场景有序集合映射关系

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!