導遊廣播: 歡迎來到「離火煉金坊」的實戰工廠!在前面的修煉中,我們收集了整數、字串、串列、字典與集合。今天,我們不談理論,直接上戰場!這個專案將讓你體會什麼叫做「選對容器,效率加倍」。
📋 任務簡報:混亂的公會名冊
你將處理一批從系統匯出的「冒險者(顧客)資料」。這批原始資料非常混亂,包含重複登記與冗餘數據。你的目標是:
- 資料去重:清除重複出現的顧客 ID。
- 資料分類:依據消費金額分為「VIP」與「普通會員」。
- 結構化輸出:產出一份乾淨的總表。
🛠️ 步驟一:原子定義 —— 單筆資料構成
每一位顧客都有名字、等級與金額。要將這些屬性綁定在一起,我們選擇 字典 (Dictionary),利用其「標籤」特性精確存取。
# 單筆顧客資料的「原子」構成
customer_1 = {
"name": "Sammy", # 字串 (str)
"level": 25, # 整數 (int)
"is_vip": True, # 布林值 (bool)
"spending": 150.5 # 浮點數 (float)
}
📦 步驟二:建立置物櫃 —— 接收原始資料
我們需要一條「傳送帶」來承載成千上萬筆資料,這裡使用 串列 (List)。注意:名單中故意混入了重複項。
# 原始資料名單 (包含重複項)
raw_data = [
{"id": 101, "name": "Sammy"},
{"id": 102, "name": "Frankie"},
{"id": 101, "name": "Sammy"}, # ⚠️ 重複登記
{"id": 103, "name": "Gracie"},
{"id": 102, "name": "Frankie"} # ⚠️ 重複登記
]
🪄 步驟三:煉金篩選 —— 運用 Set 完美去重
字典不能直接丟進 Set。我們改用一個工程師必殺技:建立一個專門記錄「看過的 ID」的 集合 (Set) 作為過濾網。
seen_ids = set() # 過濾網
clean_customers = [] # 乾淨傳送帶
for person in raw_data:
if person["id"] not in seen_ids:
clean_customers.append(person)
seen_ids.add(person["id"]) # 宣告「我看過這個 ID 了」
print(f"原本有 {len(raw_data)} 筆,去重後剩 {len(clean_customers)} 筆。")
🗂️ 步驟四:分流器啟動 —— 分類 VIP 標籤
最後,串接另一份「消費紀錄」,並利用 判斷式 (Logic) 把顧客分流。
# 消費紀錄 (ID : 金額)
spending_records = {101: 500, 102: 50, 103: 1200}
vips = []
normals = []
for person in clean_customers:
p_id = person["id"]
amount = spending_records.get(p_id, 0) # 沒紀錄就預設 0
if amount > 100:
vips.append(person["name"])
else:
normals.append(person["name"])
print(f"💎 VIP:{vips}") # ['Sammy', 'Gracie']
print(f"👤 普通:{normals}") # ['Frankie']
🧱 專案總結:容器各司其職的完美交響樂
| 容器型態 | 在本專案中扮演的角色 |
|---|---|
| Dict (字典) | 負責存儲單個顧客的詳細屬性標籤。 |
| List (串列) | 負責承載、排隊並輸出所有處理後的資料。 |
| Set (集合) | 利用「唯一性」特性,一秒過濾掉重複 ID。 |
| 基礎型態 | 代表姓名 (str)、金額 (float) 與狀態 (bool)。 |
🔥 獨家洞察:資料轉換的財富密碼
\特別提點:「現實中的數據很少會長成你想要的樣子。你需要不斷地在 List (承載) 與 Set (去重) 之間轉換。掌握了這種資料轉換 (Data Transformation) 的搭配技巧,你就真正掌握了 Python 的靈魂!」
Tags
python