Python数据结构之字典,处理结构化数据非常有用
字典
字典是Python中另一种非常重要的数据结构,它提供了一种key-value存储方式。字典是可变的、无序的(在Python 3.7+中会保持插入顺序)、不允许重复键的数据结构。字典在处理结构化数据时非常有用,例如配置信息、数据记录等。
创建和访问字典
字典可以通过花括号{}
或dict()
函数创建。可以通过键来访问、添加或修改值。
# 创建字典
student = {'name': 'Alice', 'age': 20, 'major': 'Computer Science'}
grades = dict(math=95, physics=88, chemistry=92)
# 访问字典元素
print(student['name']) # 输出: Alice
print(grades.get('math', 'N/A')) # 输出: 95
# 添加或修改元素
student['gender'] = 'Female'
grades['biology'] = 90
print(student) # 输出: {'name': 'Alice', 'age': 20, 'major': 'Computer Science', 'gender': 'Female'}
print(grades) # 输出: {'math': 95, 'physics': 88, 'chemistry': 92, 'biology': 90}
在这个例子中,我们创建了两个字典:一个存储学生信息,另一个存储成绩。通过键可以直接访问字典的值。get()
方法提供了一种安全的方式来访问字典元素,如果键不存在,它会返回一个默认值。可以通过简单的赋值来添加新的键值对或修改现有的值。
字典操作
字典支持多种操作,包括删除元素、检查键是否存在、获取所有的键或值等。
# 删除元素
del grades['physics']
removed_value = grades.pop('chemistry', 'N/A')
# 检查键是否存在
if 'age' in student:
print(f"Age: {student['age']}")
# 获取所有的键和值
print(list(student.keys())) # 输出: ['name', 'age', 'major', 'gender']
print(list(student.values())) # 输出: ['Alice', 20, 'Computer Science', 'Female']
# 遍历字典
for key, value in student.items():
print(f"{key}: {value}")
# 字典合并
student.update({'gpa': 3.8, 'year': 'Sophomore'})
print(student)
这个示例展示了几个常用的字典操作:
- 1. 使用
del
关键字或pop()
方法删除元素。 - 2. 使用
in
关键字检查键是否存在。 - 3. 使用
keys()
、values()
和items()
方法获取字典的键、值和键值对。 - 4. 使用
for
循环遍历字典。 - 5. 使用
update()
方法合并字典或添加多个键值对。
字典推导式
类似于列表推导式,字典也支持推导式,这提供了一种简洁的方式来创建新的字典。
# 使用字典推导式创建平方数字典
squares = {x: x**2 for x in range(5)}
print(squares) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 条件字典推导式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 从两个列表创建字典
keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3, 4]
my_dict = {k: v for k, v in zip(keys, values)}
print(my_dict) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
字典推导式提供了一种简洁的方式来创建字典。它的基本语法是{key_expression: value_expression for item in iterable}
。这个例子展示了如何使用字典推导式创建平方数字典、带条件的字典,以及如何从两个列表创建字典。
高级字典用法
Python的字典还有一些高级用法,例如默认字典和有序字典。
from collections import defaultdict, OrderedDict
# 默认字典
word_count = defaultdict(int)
words = ["apple", "banana", "apple", "cherry", "banana", "date"]
for word in words:
word_count[word] += 1
print(dict(word_count)) # 输出: {'apple': 2, 'banana': 2, 'cherry': 1, 'date': 1}
# 有序字典
ordered_grades = OrderedDict()
ordered_grades['Math'] = 95
ordered_grades['Physics'] = 88
ordered_grades['Chemistry'] = 92
for subject, grade in ordered_grades.items():
print(f"{subject}: {grade}")
# 字典的键必须是不可变类型
try:
invalid_dict = {[1, 2]: "This won't work"}
except TypeError as e:
print(f"错误: {e}") # 输出: 错误: unhashable type: 'list'
# 使用元组作为字典的键
valid_dict = {(1, 2): "This works"}
print(valid_dict[(1, 2)]) # 输出: This works
这个例子展示了几个高级的字典用法:
- 1.
defaultdict
:一种特殊的字典,当访问不存在的键时,它会自动创建一个默认值。在这个例子中,我们用它来计算单词出现的次数。 - 2.
OrderedDict
:一种保持键插入顺序的字典。虽然从Python 3.7开始普通字典也保持插入顺序,但OrderedDict在某些特定场景下仍然有用。 - 3. 字典键的限制:字典的键必须是不可变(可哈希)的类型。尝试使用可变类型(如列表)作为键会引发
TypeError
。相反,元组是不可变的,所以可以用作字典的键。
字典的应用场景
字典在Python编程中有广泛的应用,以下是一些常见的使用场景:
# 配置管理
config = {
'database': {
'host': 'localhost',
'port': 5432,
'user': 'admin',
'password': 'secret'
},
'api': {
'url': 'https://api.example.com',
'key': 'your-api-key'
}
}
# 缓存/记忆化
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100)) # 快速计算大型斐波那契数
# 计数器
from collections import Counter
text = "to be or not to be that is the question"
word_counts = Counter(text.split())
print(word_counts)
# 图形表示
graph = {
'A': {'B', 'C'},
'B': {'A', 'D', 'E'},
'C': {'A', 'F'},
'D': {'B'},
'E': {'B', 'F'},
'F': {'C', 'E'}
}
# 深度优先搜索
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start, end=' ')
for next in graph[start] - visited:
dfs(graph, next, visited)
return visited
dfs(graph, 'A') # 输出: A B D E F C
这个例子展示了字典在不同场景下的应用:
- 1. 配置管理:使用嵌套字典存储复杂的配置信息。
- 2. 缓存/记忆化:使用字典存储已计算的结果,避免重复计算。
- 3. 计数器:使用
Counter
类(基于字典)快速计算元素出现的次数。 - 4. 图形表示:使用字典表示图形结构,其中键是节点,值是相邻节点的列表。
字典是Python中极其强大和灵活的数据结构,适用于存储和操作键值对数据。它提供了快速的查找、插入和删除操作,使其成为处理结构化数据的理想选择。通过掌握字典的基本操作、推导式和高级用法,可以大大提高代码的效率和可读性。字典在配置管理、缓存、计数、图形表示等多种场景下都有广泛应用。理解和熟练使用字典是成为高效Python程序员的关键步骤之一。