简介:本文深入解析Python字典的核心特性与操作技巧,涵盖创建、访问、修改、遍历及高级应用场景,适合初学者巩固基础与进阶开发者提升效率。
Python字典(Dictionary)是一种基于键值对(Key-Value Pair)存储的无序可变容器,通过哈希表实现高效的数据访问。其核心特性包括:
典型应用场景:
# 使用花括号直接初始化
person = {'name': 'Alice', 'age': 25, 'skills': ['Python', 'SQL']}
# 使用dict构造函数
empty_dict = dict() # 创建空字典
from_list = dict([('a', 1), ('b', 2)]) # 从键值对列表创建
squares = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 批量初始化相同值
defaults = dict.fromkeys(['color', 'size'], 'unknown')
# 输出: {'color': 'unknown', 'size': 'unknown'}
print(person['name']) # 输出: Alice
# 注意:访问不存在的键会抛出KeyError
安全访问方法:
# 使用get方法设置默认值
print(person.get('address', 'N/A')) # 输出: N/A
# 使用in运算符检查键存在性
if 'age' in person:
print("Age exists")
person['age'] = 26 # 修改现有键
person['email'] = 'alice@example.com' # 添加新键值对
person.update({'age': 27, 'city': 'New York'})
# 或合并两个字典
new_data = {'country': 'USA'}
person.update(new_data)
del person['skills'] # 删除指定键
age = person.pop('age') # 删除并返回值
city = person.pop('country', 'Unknown') # 带默认值的pop
# 删除并返回最后一个键值对(字典有序时)
key, value = person.popitem()
# 遍历所有键
for key in person:
print(key)
# 遍历所有值
for value in person.values():
print(value)
# 遍历键值对
for key, value in person.items():
print(f"{key}: {value}")
# 按键排序遍历
for key in sorted(person):
print(key, person[key])
# 按值排序遍历(需处理值类型一致的情况)
sorted_items = sorted(person.items(), key=lambda x: x[1])
for key, value in sorted_items:
print(key, value)
# 创建嵌套字典
employees = {
'dev': {'Alice': {'age': 25, 'skills': ['Python']}},
'qa': {'Bob': {'age': 30, 'skills': ['Selenium']}}
}
# 安全访问嵌套值
def get_nested_value(d, keys, default=None):
for key in keys:
if isinstance(d, dict) and key in d:
d = d[key]
else:
return default
return d
print(get_nested_value(employees, ['dev', 'Alice', 'age'])) # 输出: 25
import json
# 字典转JSON字符串
json_str = json.dumps(person, indent=4)
print(json_str)
# JSON字符串转字典
new_dict = json.loads('{"name": "Bob", "age": 30}')
from collections import defaultdict
# 统计词频
word_counts = defaultdict(int)
words = ['apple', 'banana', 'apple', 'orange']
for word in words:
word_counts[word] += 1
print(word_counts) # 输出: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1, 'orange': 1})
__slots__
或第三方库如pympler
监控内存。in
运算符比捕获KeyError
更高效。update()
方法而非多次单独赋值。键错误处理:
# 错误方式
try:
value = person['nonexistent']
except KeyError:
value = 'default'
# 推荐方式(更简洁)
value = person.get('nonexistent', 'default')
修改不可变值:
# 错误示例(尝试修改元组值)
d = {('a', 'b'): [1, 2]}
d[('a', 'b')].append(3) # 正确:修改列表内容
# d[('a', 'b')] = [4, 5] # 正确:重新赋值
# d[('a', 'b')][0] = 4 # 错误:元组不可变,但可通过重新赋值修改
字典顺序问题(Python 3.6前):
# Python 3.6+ 保持插入顺序
d = {'a': 1, 'b': 2}
print(list(d.keys())) # 输出: ['a', 'b']
# 旧版本需使用OrderedDict
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2)])
class StudentManager:
def __init__(self):
self.students = {} # {student_id: {'name': ..., 'scores': ...}}
def add_student(self, student_id, name):
self.students[student_id] = {'name': name, 'scores': {}}
def add_score(self, student_id, subject, score):
if student_id in self.students:
self.students[student_id]['scores'][subject] = score
def get_average(self, student_id):
if student_id not in self.students:
return None
scores = self.students[student_id]['scores'].values()
return sum(scores) / len(scores) if scores else 0
def get_top_student(self):
top_student = None
max_avg = -1
for sid, data in self.students.items():
avg = self.get_average(sid)
if avg > max_avg:
max_avg = avg
top_student = (sid, data['name'], avg)
return top_student
# 使用示例
manager = StudentManager()
manager.add_student(1, 'Alice')
manager.add_score(1, 'Math', 90)
manager.add_score(1, 'English', 85)
print(manager.get_average(1)) # 输出: 87.5
print(manager.get_top_student()) # 输出: (1, 'Alice', 87.5)
get()
、update()
、pop()
等高频方法。推荐学习资源:
dict
类型说明collections
模块通过系统学习字典的这些核心特性与应用场景,你将能够更高效地处理Python中的结构化数据,为开发复杂应用打下坚实基础。