# 最常用的創(chuàng)建方式,直觀且靈活
# 可以在創(chuàng)建時直接初始化多個鍵值對
# 支持嵌套字典結(jié)構(gòu)
student = {
'name': '張三', # 字符串類型的鍵值對
'age': 20, # 數(shù)字類型的值
'scores': {'語文': 85, '數(shù)學(xué)': 92} # 嵌套字典
}

# 2. 使用dict()構(gòu)造函數(shù)
# 適用于鍵名符合變量命名規(guī)則的情況
# 代碼更簡潔,但不支持復(fù)雜的鍵名
info = dict(name='李四', age=22) # 等同于 {'name': '李四', 'age': 22}

# 3. 使用字典推導(dǎo)式
# 適合批量創(chuàng)建有規(guī)律的鍵值對
# 代碼簡潔,可讀性好
squares = {x: x**2for x in range(5)} # 創(chuàng)建數(shù)字及其平方的映射

# 4. 使用dict.fromkeys()創(chuàng)建具有默認(rèn)值的字典
# 適合初始化具有相同默認(rèn)值的多個鍵
# 注意:所有鍵會共享同一個默認(rèn)值對象
keys = ['a', 'b', 'c']
default_dict = dict.fromkeys(keys, 0) # 創(chuàng)建所有鍵對應(yīng)值為0的字典

3. 字典的基本操作

3.1 訪問和修改元素

# 創(chuàng)建示例字典
user = {
'name': '張三',
'age': 25,
'email': 'zhangsan@example.com'
}

# 1. 訪問元素的多種方式
# 使用方括號訪問 - 最直接的方式,但鍵不存在時會拋出KeyError
print(user['name']) # 輸出:張三

# 使用get()方法訪問 - 推薦的安全訪問方式
# 第一個參數(shù)是鍵名,第二個參數(shù)是鍵不存在時的默認(rèn)值
age = user.get('age', 0) # 如果'age'鍵不存在,返回默認(rèn)值0
phone = user.get('phone', '未設(shè)置') # 獲取可能不存在的鍵

# 2. 修改元素
# 直接賦值修改已存在的鍵值對
user['age'] = 26# 修改已存在的鍵的值

# 3. 添加新元素
# 使用新鍵直接賦值
user['phone'] = '13800138000'# 添加新的鍵值對

# 4. 刪除元素的多種方式
# 使用del語句 - 刪除指定鍵值對,鍵不存在會拋出KeyError
del user['email']

# 使用pop()方法 - 刪除并返回值,可以提供默認(rèn)值
phone = user.pop('phone', None) # 如果鍵不存在,返回None

# 使用popitem()方法 - 刪除并返回最后一個鍵值對
last_item = user.popitem() # 返回元組(key, value)

3.2 常用字典方法

# 1. 獲取字典信息的方法
# keys() - 獲取所有鍵
# 返回一個動態(tài)視圖對象,會隨字典變化而更新
keys = user.keys() # 獲取所有鍵的視圖
key_list = list(keys) # 轉(zhuǎn)換為列表

# values() - 獲取所有值
# 同樣返回動態(tài)視圖對象
values = user.values() # 獲取所有值的視圖
value_list = list(values) # 轉(zhuǎn)換為列表

# items() - 獲取所有鍵值對
# 返回(key, value)元組的視圖對象
items = user.items() # 獲取所有鍵值對的視圖
for key, value in items: # 常用于遍歷字典
print(f"{key}: {value}")

# 2. 修改字典的方法
# update() - 批量更新字典
# 可以使用另一個字典或鍵值對序列更新
user.update({'city': '北京', 'age': 27}) # 使用字典更新
user.update(zip(['hobby', 'job'], ['讀書', '程序員'])) # 使用鍵值對序列更新

# setdefault() - 設(shè)置默認(rèn)值
# 如果鍵不存在,則設(shè)置默認(rèn)值并返回
# 如果鍵存在,則返回現(xiàn)有值
email = user.setdefault('email', 'default@example.com')

# 3. 清理字典的方法
# clear() - 清空字典
# 刪除所有鍵值對
user.clear() # 字典變?yōu)榭兆值?{}

# copy() - 創(chuàng)建字典的淺拷貝
# 創(chuàng)建新字典,但嵌套的可變對象仍然共享引用
user_copy = user.copy()

4. 字典的高級應(yīng)用

4.1 嵌套字典

# 復(fù)雜的嵌套字典示例
# 展示了多層嵌套的數(shù)據(jù)結(jié)構(gòu)
# 適用于表示層級關(guān)系的數(shù)據(jù)
school = {
'class_1': {
'teacher': '王老師',
'students': {
'001': {
'name': '張三',
'scores': {'語文': 85, '數(shù)學(xué)': 92}
},
'002': {
'name': '李四',
'scores': {'語文': 89, '數(shù)學(xué)': 94}
}
}
}
}

# 訪問嵌套數(shù)據(jù)的方法
# 1. 使用多級鍵訪問
print(school['class_1']['students']['001']['scores']['語文']) # 輸出:85

# 2. 使用get()方法的安全訪問
# 避免鍵不存在時的異常
score = school.get('class_1', {}).get('students', {}).get('001', {}).get('scores', {}).get('語文', 0)

# 3. 修改嵌套數(shù)據(jù)
# 逐層創(chuàng)建或修改數(shù)據(jù)
school['class_2'] = {} # 創(chuàng)建新的班級
school['class_2']['teacher'] = '李老師'# 添加教師信息
school['class_2']['students'] = {} # 初始化學(xué)生字典

4.2 字典推導(dǎo)式高級用法

# 1. 條件字典推導(dǎo)式
# 根據(jù)條件篩選鍵值對
scores = {'張三': 85, '李四': 92, '王五': 78, '趙六': 95}
# 篩選成績大于等于85分的學(xué)生
pass_students = {name: score for name, score in scores.items() if score >= 85}

# 2. 轉(zhuǎn)換值的字典推導(dǎo)式
# 對原字典的值進(jìn)行轉(zhuǎn)換
grades = {name: 'A'if score >= 90else'B'if score >= 80else'C'
for name, score in scores.items()}

# 3. 嵌套字典推導(dǎo)式
# 創(chuàng)建復(fù)雜的嵌套字典結(jié)構(gòu)
# 生成乘法表字典
matrix = {i: {j: i*j for j in range(3)} for i in range(3)}
# 結(jié)果示例:{0: {0: 0, 1: 0, 2: 0}, 1: {0: 0, 1: 1, 2: 2}, 2: {0: 0, 1: 2, 2: 4}}

5. 使用字典格式化字符串

5.1 基本格式化

# 1. 使用%操作符(舊式格式化)
# 語法簡單,但功能有限
info = {'name': '張三', 'age': 25}
print('%(name)s is %(age)d years old' % info)

# 2. 使用str.format()方法
# 更靈活,支持更多格式化選項
print('{name} is {age} years old'.format(**info))

# 3. 使用f-string(推薦,Python 3.6+)
# 最簡潔、直觀的方式
# 支持直接使用表達(dá)式
print(f"{info['name']} is {info['age']} years old")

5.2 高級格式化技巧

# 1. 對齊和填充
data = {'name': '張三', 'score': 95.5}
# 左對齊,寬度10
# 右對齊,寬度8,保留2位小數(shù)
print(f"{data['name']:<10}|{data['score']:>8.2f}")

# 2. 使用字典進(jìn)行復(fù)雜模板格式化
# 適用于生成報告、配置文件等
template = '''
學(xué)生信息:
姓名:{name}
年齡:{age}
成績:{score:.1f}
'''

student = {
'name': '張三',
'age': 18,
'score': 95.6
}

print(template.format(**student))

6. 字典性能優(yōu)化建議

6.1 字典創(chuàng)建優(yōu)化

# 1. 預(yù)分配空間
# 當(dāng)知道字典大小時,使用dict.fromkeys()預(yù)分配空間
# 避免頻繁的內(nèi)存重新分配
keys = range(10000)
optimized_dict = dict.fromkeys(keys) # 預(yù)分配10000個空間

# 對比:動態(tài)增長的字典
unoptimized_dict = {}
for i in range(10000):
unoptimized_dict[i] = None# 會導(dǎo)致多次內(nèi)存重新分配

# 2. 使用字典推導(dǎo)式替代循環(huán)
# 字典推導(dǎo)式通常比循環(huán)創(chuàng)建字典更快
squares_comprehension = {x: x**2for x in range(1000)} # 更快

squares_loop = {}
for x in range(1000): # 更慢
squares_loop[x] = x**2

6.2 訪問優(yōu)化

# 1. 使用get()方法的最佳實踐
# 當(dāng)確定鍵存在時,使用方括號訪問更快
user = {'name': '張三', 'age': 25}

# 快:確定鍵存在時使用方括號
name = user['name']

# 慢:不必要的get()調(diào)用
name = user.get('name')

# 正確使用場景:鍵可能不存在時使用get()
phone = user.get('phone', '未設(shè)置')

# 2. 避免重復(fù)訪問
# 對頻繁訪問的值進(jìn)行本地緩存
def process_user_slow(user):
# 差:重復(fù)訪問字典
print(f"姓名:{user['name']}")
print(f"年齡:{user['age']}")
if user['age'] > 18:
print(f"{user['name']}是成年人")

def process_user_fast(user):
# 好:將頻繁使用的值緩存到局部變量
name = user['name']
age = user['age']
print(f"姓名:{name}")
print(f"年齡:{age}")
if age > 18:
print(f"{name}是成年人")

6.3 更新優(yōu)化

# 1. 批量更新優(yōu)化
# 使用update()方法進(jìn)行批量更新,而不是多次單獨更新
user = {'name': '張三'}

# 差:多次單獨更新
user['age'] = 25
user['city'] = '北京'
user['email'] = 'zhangsan@example.com'

# 好:使用update()批量更新
user.update({
'age': 25,
'city': '北京',
'email': 'zhangsan@example.com'
})

# 2. 避免頻繁的增刪操作
# 如果需要頻繁增刪,考慮使用collections.defaultdict或set
from collections import defaultdict

# 統(tǒng)計單詞頻率的例子
# 使用defaultdict避免鍵檢查
word_counts = defaultdict(int)
text = "the quick brown fox jumps over the lazy dog"
for word in text.split():
word_counts[word] += 1# 無需檢查鍵是否存在

6.4 內(nèi)存優(yōu)化

# 1. 使用__slots__優(yōu)化類字典
# 當(dāng)類屬性固定時,使用__slots__可以顯著減少內(nèi)存使用
class UserNormal:
def __init__(self, name, age):
self.name = name
self.age = age

class UserOptimized:
__slots__ = ['name', 'age'] # 顯著減少內(nèi)存使用
def __init__(self, name, age):
self.name = name
self.age = age

# 2. 及時清理不需要的數(shù)據(jù)
# 使用clear()方法而不是重新賦值
large_dict = {i: i**2for i in range(10000)}

# 差:直接賦值新字典
large_dict = {} # 舊字典仍在內(nèi)存中,等待垃圾回收

# 好:使用clear()清理
large_dict.clear() # 立即釋放內(nèi)存

# 3. 使用弱引用字典
# 當(dāng)需要緩存對象但不阻止它們被垃圾回收時
from weakref import WeakKeyDictionary

class Cache:
def __init__(self):
# 當(dāng)鍵對象沒有其他引用時,自動從字典中刪除
self.data = WeakKeyDictionary()

6.5 性能測試示例

import timeit
import sys

# 1. 字典創(chuàng)建性能對比
def test_dict_creation():
# 測試不同創(chuàng)建方法的性能
setup = """size = 1000"""

test1 = """dict_comp = {x: x**2 for x in range(size)}"""
test2 = """dict_loop = {}
for x in range(size):
dict_loop[x] = x**2"""

time1 = timeit.timeit(test1, setup, number=1000)
time2 = timeit.timeit(test2, setup, number=1000)

print(f"字典推導(dǎo)式: {time1:.4f}秒")
print(f"循環(huán)創(chuàng)建: {time2:.4f}秒")

# 2. 內(nèi)存使用對比
def compare_memory_usage():
# 測試普通類和使用__slots__的類的內(nèi)存占用
normal_users = [UserNormal(f"user{i}", i) for i in range(1000)]
optimized_users = [UserOptimized(f"user{i}", i) for i in range(1000)]

normal_size = sys.getsizeof(normal_users[0]) * len(normal_users)
optimized_size = sys.getsizeof(optimized_users[0]) * len(optimized_users)

print(f"普通類對象占用內(nèi)存: {normal_size/1024:.2f}KB")
print(f"優(yōu)化類對象占用內(nèi)存: {optimized_size/1024:.2f}KB")

if __name__ == '__main__':
print("性能測試結(jié)果:")
test_dict_creation()
print("\n內(nèi)存使用對比:")
compare_memory_usage()

6.6 最佳實踐總結(jié)

  1. 創(chuàng)建優(yōu)化
  1. 訪問優(yōu)化
  1. 更新優(yōu)化
  1. 內(nèi)存優(yōu)化
  1. 其他建議

上一篇:

什么是 GPT4all

下一篇:

Deribit API – 入門指南
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費