defaultdict 20 個範例
1. 建立圖的鄰接表
用 defaultdict(list)
建立鄰接表,方便處理節點與節點之間的關係。
from collections import defaultdict
edges = [(1, 2), (2, 3), (3, 4), (4, 5)] # 圖的邊
graph = defaultdict(list) # 初始化鄰接表
for u, v in edges:
graph[u].append(v) # 加入雙向關係
graph[v].append(u)
print(graph) # 印出鄰接表
2. 計算字元出現次數
用 defaultdict(int)
統計字串中每個字元的出現次數。
from collections import defaultdict
text = "defaultdict is powerful" # 目標文字
char_count = defaultdict(int) # 初始化字元計數器
for char in text:
char_count[char] += 1 # 累加字元次數
print(char_count) # 印出結果
3. 分類資料
將資料按照類別分組,例如水果與蔬菜。
from collections import defaultdict
data = [("apple", "fruit"), ("carrot", "vegetable"), ("banana", "fruit")]
grouped_data = defaultdict(list) # 初始化分類資料結構
for item, category in data:
grouped_data[category].append(item) # 將項目加入對應類別
print(grouped_data) # 印出分組結果
4. 模擬二維表格
用 defaultdict(dict)
建立二維結構。
from collections import defaultdict
table = defaultdict(dict) # 初始化二維表格
table["row1"]["col1"] = 1
table["row1"]["col2"] = 2
table["row2"]["col1"] = 3
print(table) # 印出表格內容
5. 計算類別數量
用 defaultdict(int)
統計每個類別中的項目數量。
from collections import defaultdict
categories = [("electronics", "phone"), ("electronics", "laptop"), ("food", "apple")]
category_count = defaultdict(int) # 初始化類別計數器
for category, item in categories:
category_count[category] += 1 # 累加類別數量
print(category_count) # 印出類別統計
6. 找出每類的最大值
在多筆資料中找出每個鍵對應的最大值。
from collections import defaultdict
scores = [("Alice", 85), ("Bob", 95), ("Alice", 90), ("Bob", 88)]
max_scores = defaultdict(int) # 初始化最大值字典
for name, score in scores:
max_scores[name] = max(max_scores[name], score) # 更新最大值
print(max_scores) # 印出最大值結果
7. 計算帳戶餘額
根據交易記錄計算每個帳戶的最終餘額。
from collections import defaultdict
transactions = [("AccountA", 100), ("AccountB", 50), ("AccountA", -30), ("AccountB", 20)]
balances = defaultdict(int) # 初始化餘額字典
for account, amount in transactions:
balances[account] += amount # 累加金額
print(balances) # 印出帳戶餘額
8. 計算單字次數
統計句子中每個單字出現的次數。
from collections import defaultdict
sentence = "defaultdict is a very useful tool defaultdict is powerful"
word_count = defaultdict(int) # 初始化單字計數器
for word in sentence.split():
word_count[word] += 1 # 累加單字次數
print(word_count) # 印出單字計數
9. 管理多對多關係
紀錄學生與課程的多對多關係。
from collections import defaultdict
student_courses = [("Alice", "Math"), ("Alice", "Science"), ("Bob", "Math")]
course_students = defaultdict(list) # 初始化多對多關係
for student, course in student_courses:
course_students[course].append(student) # 將學生加入對應課程
print(course_students) # 印出課程與學生的關係
10. 計算類別總長度
計算每個類別中資料的字元總和。
from collections import defaultdict
data = [("fruit", "apple"), ("vegetable", "carrot"), ("fruit", "banana")]
lengths = defaultdict(int) # 初始化類別長度計算
for category, item in data:
lengths[category] += len(item) # 累加字元長度
print(lengths) # 印出類別總長度
11. 記錄字元位置
紀錄字串中每個字元的索引位置。
from collections import defaultdict
text = "defaultdict"
char_positions = defaultdict(list) # 初始化字元位置紀錄
for index, char in enumerate(text):
char_positions[char].append(index) # 將索引加入對應字元
print(char_positions) # 印出字元位置
12. 建立多層嵌套字典
用 defaultdict
動態建立多層結構。
from collections import defaultdict
nested_dict = lambda: defaultdict(nested_dict) # 定義多層嵌套函數
data = nested_dict()
data["level1"]["level2"]["level3"] = "value" # 設定值
print(data) # 印出多層結構
13. 日期按月份分組
根據日期分組資料,統計每月的項目。
from collections import defaultdict
dates = ["2024-01-01", "2024-01-15", "2024-02-01", "2024-02-15"]
monthly_data = defaultdict(list) # 初始化月份分組
for date in dates:
month = date[:7] # 提取年月
monthly_data[month].append(date) # 加入對應月份
print(monthly_data) # 印出每月資料
14. 倒排索引
建立倒排索引,用於快速查詢關鍵字。
from collections import defaultdict
documents = {1: "defaultdict is amazing", 2: "collections includes defaultdict"}
inverted_index = defaultdict(list) # 初始化倒排索引
for doc_id, content in documents.items():
for word in content.split():
inverted_index[word].append(doc_id) # 加入對應文檔
print(inverted_index) # 印出倒排索引
15. 合併多個字典
將多個字典中的數值合併。
from collections import defaultdict
dicts = [{"a": 1, "b": 2}, {"a": 3, "c": 4}, {"b": 5}]
merged = defaultdict(list) # 初始化合併結果
for d in dicts:
for key, value in d.items():
merged[key].append(value) # 合併對應鍵的值
print(merged) # 印出合併結果
沒有留言:
張貼留言