文章目录
Python 字典 (Dictionary) 深度总结
字典是 Python 中一种非常灵活且强大的数据结构,它允许你存储键值对(key-value pairs),并且可以快速地根据键查找对应的值。字典是可变的(mutable),意味着你可以在创建后修改、添加或删除其中的键值对。
1. 字典的基本概念
- 键值对:字典中的每个元素都是一个键值对,格式为
key: value
,键和值之间用冒号:
分隔。 - 键的唯一性:字典中的键必须是唯一的,如果重复了,后面的键值对会覆盖前面的同名键。
- 值的多样性:字典中的值可以是任意类型的 Python 对象,包括数字、字符串、列表、元组、其他字典等。
- 键的不可变性:字典的键必须是不可变类型,如字符串、数字或元组(但元组内部不能包含可变对象)。列表和其他可变类型不能作为键。
# 创建字典
tinydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
# 键值对的格式
d = {key1: value1, key2: value2}
2. 访问字典中的值
- 通过键访问:使用方括号
[]
和键来访问字典中的值。如果键不存在,会抛出KeyError
异常。 - 使用
get()
方法:get()
方法允许你安全地访问字典中的值,并且可以指定默认值,避免抛出异常。
# 通过键访问
print(tinydict['Name']) # 输出: Zara
# 使用 get() 方法
print(tinydict.get('Name')) # 输出: Zara
print(tinydict.get('Alice', 'Not Found')) # 输出: Not Found
3. 修改字典
- 更新现有键值对:直接通过键赋值来更新字典中已有的键值对。
- 添加新键值对:通过键赋值来添加新的键值对。
- 删除键值对:
del
语句:删除指定的键值对。pop()
方法:删除并返回指定键的值。popitem()
方法:随机删除并返回一个键值对(Python 3.7 及以上版本按插入顺序删除最后一个键值对)。clear()
方法:清空整个字典。
# 更新和添加键值对
tinydict['Age'] = 8 # 更新
tinydict['School'] = "RUNOOB" # 添加
print(tinydict) # 输出: {'Name': 'Zara', 'Age': 8, 'Class': 'First', 'School': 'RUNOOB'}
# 删除键值对
del tinydict['Name']
print(tinydict) # 输出: {'Age': 8, 'Class': 'First', 'School': 'RUNOOB'}
popped_value = tinydict.pop('Class')
print(popped_value) # 输出: First
print(tinydict) # 输出: {'Age': 8, 'School': 'RUNOOB'}
popped_item = tinydict.popitem()
print(popped_item) # 输出: ('School', 'RUNOOB')
print(tinydict) # 输出: {'Age': 8}
tinydict.clear()
print(tinydict) # 输出: {}
4. 遍历字典
- 遍历键:使用
keys()
方法或直接遍历字典。 - 遍历值:使用
values()
方法。 - 遍历键值对:使用
items()
方法。
# 遍历键
for key in tinydict:
print(key)
# 或者使用 keys() 方法
for key in tinydict.keys():
print(key)
# 遍历值
for value in tinydict.values():
print(value)
# 遍历键值对
for key, value in tinydict.items():
print(f"{key}: {value}")
5. 字典的内置函数和方法
函数/方法 | 描述 |
---|---|
len(dict) | 返回字典中键值对的数量。 |
str(dict) | 返回字典的可打印字符串表示。 |
type(variable) | 返回变量的类型,如果是字典则返回 dict 类型。 |
dict.clear() | 删除字典中的所有键值对。 |
dict.copy() | 返回字典的一个浅拷贝。 |
dict.fromkeys(seq[, value]) | 创建一个新的字典,以序列 seq 中的元素作为键,value 为所有键的初始值(默认为 None )。 |
dict.get(key, default=None) | 返回指定键的值,如果键不存在则返回 default (默认为 None )。 |
dict.items() | 返回一个包含所有键值对的视图对象(可迭代的 (key, value) 元组)。 |
dict.keys() | 返回一个包含所有键的视图对象(可迭代)。 |
dict.values() | 返回一个包含所有值的视图对象(可迭代)。 |
dict.setdefault(key, default=None) | 如果键存在则返回其值,否则插入该键并将值设为 default (默认为 None )。 |
dict.update(other_dict) | 将 other_dict 中的键值对更新到当前字典中。如果有相同的键,则覆盖原来的值。 |
dict.pop(key[, default]) | 删除并返回指定键的值,如果键不存在则返回 default (默认抛出 KeyError )。 |
dict.popitem() | 随机删除并返回一个键值对(Python 3.7 及以上版本按插入顺序删除最后一个键值对)。 |
6. 字典的高级用法
6.1 字典推导式 (Dictionary Comprehensions)
字典推导式是一种简洁的方式来创建字典。它允许你在一行代码中生成复杂的字典。
# 基本字典推导式
squares = {x: x**2 for x in range(6)}
print(squares) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 带条件的字典推导式
even_squares = {x: x**2 for x in range(6) if x % 2 == 0}
print(even_squares) # 输出: {0: 0, 2: 4, 4: 16}
# 嵌套字典推导式
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
flattened = {f"row{i}_col{j}": matrix[i][j] for i in range(len(matrix)) for j in range(len(matrix[i]))}
print(flattened)
# 输出: {'row0_col0': 1, 'row0_col1': 2, 'row0_col2': 3, 'row1_col0': 4, 'row1_col1': 5, 'row1_col2': 6, 'row2_col0': 7, 'row2_col1': 8, 'row2_col2': 9}
6.2 字典的浅拷贝与深拷贝
- 浅拷贝:只复制字典的第一层键值对,对于嵌套的字典,内部的字典仍然是引用。
- 深拷贝:递归地复制整个字典及其嵌套的子字典。
import copy
# 浅拷贝
original = {'a': 1, 'b': {'c': 2}}
shallow_copy = original.copy()
original['b']['c'] = 3
print(original) # 输出: {'a': 1, 'b': {'c': 3}}
print(shallow_copy) # 输出: {'a': 1, 'b': {'c': 3}}
# 深拷贝
deep_copy = copy.deepcopy(original)
original['b']['c'] = 4
print(original) # 输出: {'a': 1, 'b': {'c': 4}}
print(deep_copy) # 输出: {'a': 1, 'b': {'c': 3}}
6.3 字典的合并
在 Python 3.9 及以上版本中,你可以使用 |
运算符来合并两个字典。对于重复的键,后面的字典中的值会覆盖前面的字典中的值。
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged_dict = dict1 | dict2
print(merged_dict) # 输出: {'a': 1, 'b': 3, 'c': 4}
# 也可以使用 update() 方法
dict1.update(dict2)
print(dict1) # 输出: {'a': 1, 'b': 3, 'c': 4}
6.4 字典的默认值
collections.defaultdict
是 collections
模块中的一个类,它允许你为字典的键设置默认值。当你访问一个不存在的键时,defaultdict
会自动创建该键,并赋予默认值。
from collections import defaultdict
# 创建一个 defaultdict,键的默认值为 0
counts = defaultdict(int)
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
for word in words:
counts[word] += 1
print(counts) # 输出: defaultdict(<class 'int'>, {'apple': 3, 'banana': 2, 'orange': 1})
6.5 字典的排序
你可以使用 sorted()
函数结合 lambda
表达式来对字典进行排序。你可以根据键或值进行排序。
# 根据键排序
d = {'apple': 3, 'banana': 2, 'orange': 1}
sorted_by_key = dict(sorted(d.items()))
print(sorted_by_key) # 输出: {'apple': 3, 'banana': 2, 'orange': 1}
# 根据值排序
sorted_by_value = dict(sorted(d.items(), key=lambda item: item[1]))
print(sorted_by_value) # 输出: {'orange': 1, 'banana': 2, 'apple': 3}
7. 字典的常见应用场景
- 配置文件:字典非常适合用于存储配置信息,键可以是配置项的名称,值可以是配置项的值。
- 映射关系:字典可以用于存储映射关系,例如用户 ID 到用户名的映射、国家代码到国家名称的映射等。
- 缓存:字典可以用作简单的缓存,将计算结果存储在字典中,以便后续快速访问。
- 计数器:
collections.Counter
是基于字典的计数器类,适合用于统计元素出现的次数。
from collections import Counter
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)
print(counter) # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})
8. 字典的性能优化
- 使用
dict.setdefault()
:如果你需要频繁检查字典中是否存在某个键并设置默认值,使用setdefault()
可以简化代码并提高效率。 - 使用
collections.defaultdict
:对于需要频繁处理缺失键的情况,defaultdict
可以避免每次都检查键是否存在,从而提高性能。 - 避免频繁的
dict.copy()
:如果你只需要部分复制字典,考虑使用字典推导式或dict.update()
来构建新的字典,而不是使用copy()
。
9. 字典的国际化和本地化
虽然字典本身没有直接涉及国际化和本地化的功能,但在处理多语言数据时,你可以结合 gettext
模块来实现字典内容的翻译。
import gettext
# 加载翻译文件
translator = gettext.translation('messages', localedir='locales', languages=['fr'])
_ = translator.gettext
translations = {'apple': 'pomme', 'banana': 'banane', 'orange': 'orange'}
translated_dict = {k: _(v) for k, v in translations.items()}
print(translated_dict) # 输出: {'apple': 'pomme', 'banana': 'banane', 'orange': 'orange'}
总结
通过上述详细的解释,我们全面介绍了 Python 字典的基本概念、访问方式、修改操作、内置函数和方法、高级用法以及性能优化技巧。字典是 Python 中非常强大且灵活的数据结构,掌握这些知识可以帮助你在编写代码时更加高效地处理和操作数据。
如果你有任何具体问题或需要进一步的解释,请随时告诉我!
标签:python,dict,key,print,键值,tinydict,字典 From: https://blog.csdn.net/qq_55125921/article/details/144495158