1.1 字典及其特性
字典 (dictionary) 在 Python 中是一种 有序的键值对集合,每个键都是唯一的。字典是 Python 中最灵活和强大的数据类型之一,用于存储和管理数据。我们会经常使用它们,几乎和列表一样常用。很快你就会发现 :)
字典的主要特性:
1. 唯一键
字典中的每个键必须是唯一的。如果向字典中添加一个已经存在的键的键值对,旧值将会被新值替换。例如,如果你想存储学生数据并使用他们的ID作为键:
students = {"123": "John", "124": "Alice", "123": "Mike"}
print(students) # 输出: {'123': 'Mike', '124': 'Alice'}
2. 有序性
注意!
在 Python 3.7 之前,字典是无序集合,元素的顺序是无法保证的。从 Python 3.7 开始,字典保持元素的添加顺序,但直到 Python 3.8 版本,这一特性才成为语言规范的标准。
那是5年前的事了。我们现在学的 Python 是基于 3.12 版,所以你可以放心地把字典看作
有序元素集合
。
3. 可变性
字典是可变的,这意味着你可以在创建字典后添加、修改或删除元素。比如,添加学生地址:
student = {"name": "John", "age": 20}
student["address"] = "123 Main St"
print(student) # 输出: {'name': 'John', 'age': 20, 'address': '123 Main St'}
4. 效率
字典被优化为快速查找、添加和删除键值对。平均情况下,查找、添加和删除操作在常数时间内完成,即 O(1)。算法复杂度的概念稍后我们在学习“算法和数据结构”时会详细介绍。
5. 键和值
字典中的键必须是任何不可变的数据类型,如字符串、数字或元组。值可以是任何数据类型,包括其他字典。
6. 访问和修改的方法
字典支持多种访问元素、添加、修改和删除键值对的方法。这些方法包括
get()
, keys()
, values()
,
items()
, update()
, pop()
等等。接下来的讲座中会详细解释。
7. 遍历元素
你可以用循环遍历字典中的键、值或键值对。这使得在字典元素上进行操作变得很容易。例如:
student = {"name": "John", "age": 20, "address": "123 Main St"}
for key, value in student.items():
print(f"{key}: {value}")
输出将会是:
name: John
age: 20
address: 123 Main St
8. 键的可哈希性
字典中的键必须是可哈希的。这意味着键必须拥有一个在其生命周期中不变的哈希值。哈希值通过哈希函数获得,哈希函数是一个将任意长度的输入数据转换为固定长度输出值的算法。这个值也被称为哈希值或哈希码。不可变的数据类型,如字符串、数字和元组,是可哈希的,可以用作键。
我们将在“算法和数据结构”主题中学习更多关于哈希函数和可哈希性的内容。
1.2 使用 {}
创建字典
在 Python 中可以通过多种方式创建字典。以下是创建字典对象的不同方式和示例:
使用花括号 {}
创建字典最常见的方法是使用带有键值对的花括号,键值对之间用逗号分隔。 键和值之间用冒号分隔。
# 创建空字典
empty_dict = {}
# 创建有元素的字典
person = {
"name": "John",
"age": 30,
"city": "New York"
}
print(type(person))
print(person)
注意!
创建字典和创建集合很相似。实际上可以把字典看作是一组绑定了值的键集合。
如果在花括号中仅列出“键”,则创建一个集合;如果在键后面加一个冒号并指定值,则创建一个字典。空的花括号总是一个字典。
# 创建空字典
empty_dict = {}
# 用元素创建集合
unique_items = {
"name",
"age",
"city"
}
print(type(unique_items))
print(unique_items)
1.3 使用 dict()
函数创建字典
dict()
函数可以用于从一系列键值对或命名参数创建字典。
基于键值对的示例:
# 从列表元组创建字典
person = dict([("name", "John"), ("age", 30), ("city", "New York")])
print(person)
使用命名参数的示例。这里不需要额外的括号:
# 用命名参数创建字典
person = dict(name="John", age=30, city="New York")
print(person)
使用方法 dict.fromkeys()
fromkeys()
方法创建一个带有指定键和值的字典。
# 创建一个带默认值的字典
keys = ["name", "age", "city"]
default_value = None
person = dict.fromkeys(keys, default_value)
print(person)
字典将有三个键,但它们都将包含一个值。
1.4 从现有变量创建字典
可以使用变量作为键和值来创建字典。
# 从变量创建字典
name = "John"
age = 30
city = "New York"
person = {"name": name, "age": age, "city": city}
print(person)
1.5 使用字典生成器
字典生成器 允许通过简洁的构造创建字典,类似于列表生成器。
# 使用字典生成器创建字典
squares = {x: x**2 for x in range(1, 6)}
print(squares)
1.6 访问字典中的值
要通过键获取值,可以使用 []
语法:
# 访问字典中的值
person = {"name": "John", "age": 30, "city": "New York"}
print(person["name"]) # 输出: John
注意!
如果键未找到,将会引发 KeyError
错误。为了避免这个问题,可以使用 get()
方法,该方法返回键对应的值(如果存在),否则返回 None
(或者指定的默认值)。
# 使用 get() 方法访问字典中的值
person = {"name": "John", "age": 30, "city": "New York"}
print(person.get("name")) # 输出: John
print(person.get("address", "地址未找到")) # 输出: 地址未找到
1.7 修改字典中的值
可以通过键访问字典中的值并赋予新值来修改字典中的值。
# 修改字典中的值
person = {"name": "John", "age": 30, "city": "New York"}
person["age"] = 31
print(person) # 输出: {'name': 'John', 'age': 31, 'city': 'New York'}
1.8 从字典中删除元素
可以使用 del
操作符或 pop()
方法删除元素。
# 使用 del 删除元素
person = {"name": "John", "age": 30, "city": "New York"}
del person["age"]
print(person) # 输出: {'name': 'John', 'city': 'New York'}
# 使用 pop() 删除元素
person = {"name": "John", "age": 30, "city": "New York"}
age = person.pop("age")
print(person) # 输出: {'name': 'John', 'city': 'New York'}
print(age) # 输出: 30
1.9 检查字典中是否存在键
你可以使用 in
操作符检查字典中是否包含某个键。
# 检查字典中是否存在键
person = {"name": "John", "age": 30, "city": "New York"}
print("name" in person) # 输出: True
print("address" in person) # 输出: False
1.10 遍历字典中的元素
你可以遍历字典中的键、值或键值对:
# 遍历字典的键
person = {"name": "John", "age": 30, "city": "New York"}
for key in person:
print(key)
# 遍历字典的值
for value in person.values():
print(value)
# 遍历字典的键值对
for key, value in person.items():
print(f"{key}: {value}")
1.11 字典在实际问题中的使用示例
我们来看几个现实生活中的例子,字典的使用可能会很有用:
示例 1: 计算文本中单词的频率
假设我们有一段文本,我们想计算每个单词在这段文本中出现的频率。
text = "hello world hello"
word_count = {}
for word in text.split():
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
print(word_count) # 输出: {'hello': 2, 'world': 1}
示例 2: 存储学生数据
我们可以使用字典存储学生数据,其中键是学生的ID,值是他们的数据。
students = {
"123": {"name": "John", "age": 20, "major": "Computer Science"},
"124": {"name": "Alice", "age": 22, "major": "Mathematics"}
}
print(students["123"]["name"]) # 输出: John
示例 3: 电话簿
可以使用字典创建一个简单的电话簿,其中键是姓名,值是电话号码。
phone_book = {
"John": "123-456-7890",
"Alice": "987-654-3210"
}
print(phone_book["Alice"]) # 输出: 987-654-3210
GO TO FULL VERSION