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. 1. 使用del关键字或pop()方法删除元素。
  2. 2. 使用in关键字检查键是否存在。
  3. 3. 使用keys()values()items()方法获取字典的键、值和键值对。
  4. 4. 使用for循环遍历字典。
  5. 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. 1. defaultdict:一种特殊的字典,当访问不存在的键时,它会自动创建一个默认值。在这个例子中,我们用它来计算单词出现的次数。
  2. 2. OrderedDict:一种保持键插入顺序的字典。虽然从Python 3.7开始普通字典也保持插入顺序,但OrderedDict在某些特定场景下仍然有用。
  3. 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. 1. 配置管理:使用嵌套字典存储复杂的配置信息。
  2. 2. 缓存/记忆化:使用字典存储已计算的结果,避免重复计算。
  3. 3. 计数器:使用Counter类(基于字典)快速计算元素出现的次数。
  4. 4. 图形表示:使用字典表示图形结构,其中键是节点,值是相邻节点的列表。

字典是Python中极其强大和灵活的数据结构,适用于存储和操作键值对数据。它提供了快速的查找、插入和删除操作,使其成为处理结构化数据的理想选择。通过掌握字典的基本操作、推导式和高级用法,可以大大提高代码的效率和可读性。字典在配置管理、缓存、计数、图形表示等多种场景下都有广泛应用。理解和熟练使用字典是成为高效Python程序员的关键步骤之一。

THE END