首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python Dictionary 字典完整入門:建立、存取、更新、刪除、鍵特性與常見陷阱詳解

     編輯:更多程式設計知識

字典 是 Python 核心資料結構:可變、無序 (Py3.7+ 保留插入序)、鍵值對映射。別名關聯陣列、雜湊表。本文系統整理建立、存取、修改、刪除、鍵限制與最佳實踐。

建立字典


# 字面語法
d1 = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

# dict() 建構子
d2 = dict(abc=456)           # 關鍵字引數 (鍵必須合法識別字)
d3 = dict([('a', 1), ('b', 2)])  # 可迭代鍵值對
d4 = dict.fromkeys(['a', 'b', 'c'], 0)  # 統一預設值

# 空字典
empty = {}
empty2 = dict()

存取值


d = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

print(d['Name'])        # 'Zara' (不存在拋 KeyError)
print(d.get('Name'))    # 'Zara'
print(d.get('Missing')) # None
print(d.get('Missing', 'N/A'))  # 'N/A' (預設值)

# in 檢查存在性
print('Name' in d)      # True
print('Alice' in d)     # False

更新與新增


d = {'Name': 'Zara', 'Age': 7}

d['Age'] = 8           # 修改現有
d['School'] = 'DPS'    # 新增
d.update({'Age': 9, 'City': 'Taipei'})  # 批次更新
print(d)  # {'Name': 'Zara', 'Age': 9, 'School': 'DPS', 'City': 'Taipei'}

刪除操作


d = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

del d['Name']          # 刪除指定鍵 (不存在拋 KeyError)
popped = d.pop('Age')  # 刪除並回傳值
# d.pop('Missing', 'default')  # 不存在回傳預設值

d.clear()              # 清空所有項目
# del d                # 刪除變數綁定

鍵的特性與限制

規則說明範例
唯一性重複鍵後勝{'a':1, 'a':2} -> {'a':2}
可雜湊性鍵必須 immutablestr、int、tuple(元素皆 immutable) ✓ / list、dict、set ✗
值無限制可為任意物件包含 list、dict、函數、類別

# 合法鍵
d = {(1, 2): 'tuple key', 3.14: 'float key', True: 'bool key'}

# 非法鍵
# d = {[1,2]: 'list key'}  # TypeError: unhashable type: 'list'
# d = {{'a':1}: 'dict key'} # TypeError

核心方法速查表

遍歷模式


d = {'a': 1, 'b': 2}

# 僅鍵
for k in d:
    print(k)

# 鍵值對 (推薦)
for k, v in d.items():
    print(k, v)

# 僅值
for v in d.values():
    print(v)

# 列表化 (需靜態快照)
keys = list(d.keys())

常見陷阱


# 1. 迴圈中修改字典大小
d = {'a': 1, 'b': 2}
for k in d:
    if k == 'a':
        del d[k]  # RuntimeError: dictionary changed size during iteration
# 解法:遍歷副本
for k in list(d.keys()):
    if k == 'a':
        del d[k]

# 2. 可變預設值陷阱
def add_item(item, shopping_list=[]):
    shopping_list.append(item)
    return shopping_list
print(add_item('apple'))  # ['apple']
print(add_item('banana')) # ['apple', 'banana'] 共享同一列表!
# 正確:
def add_item(item, shopping_list=None):
    if shopping_list is None:
        shopping_list = []
    shopping_list.append(item)
    return shopping_list

# 3. 深拷貝需求
import copy
d = {'a': [1,2]}
d2 = d.copy()      # 淺拷貝
d2['a'].append(3)
print(d['a'])      # [1, 2, 3] 受影響!
d3 = copy.deepcopy(d)  # 深拷貝

Python 3.7+ 插入序保證

CPython 3.6 實作細節,3.7 正式規範:字典保留插入順序。keys()/values()/items() 依插入序產出。但不要依賴此特性做排序,需排序請用 sorted(d.items())。

字典是 Python 最高效的查找表,掌握其 API 與陷阱,能寫出簡潔高效的資料處理程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法功能回傳值
keys()所有鍵視圖dict_keys (可迭代、動態)
values()所有值視圖dict_values
items()所有鍵值對視圖dict_items (可迭代、動態)
get(k, default)安全取值值或 default
setdefault(k, default)不存在則設定並回傳值
pop(k, default)刪除並回傳值或 default
popitem()刪除並回傳任一項 (LIFO)(k, v)
update(other)批次合併None
copy()淺拷貝新字典
fromkeys(seq, val)類別方法建立新字典