iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

第十天:資料結構基礎—集合(Set)與其應用

內容概述:

今天,我們將介紹 Python 中非常重要的資料結構——集合(Set)。集合是一種無序且不允許重複元素的數據結構,這使它特別適合用來處理需要「唯一性」的數據問題。集合還具備非常高效的運算操作,像是聯集、交集和差集。


一、什麼是集合(Set)?

  1. 集合的定義

    • 集合是一種無序且不重複的元素集合。這意味著集合中的每個元素都是唯一的,不會有重複數據。
    • 集合與列表不同,集合不會記錄元素的插入順序,因此無法用索引來存取特定元素。
  2. 集合的基本語法

    • 集合可以使用大括號 {}set() 函數來創建。例如:
      my_set = {1, 2, 3, 4}
      another_set = set([3, 4, 5, 6])
      
  3. 空集合的創建

    • 注意,創建空集合必須使用 set() 而不是 {},因為 {} 預設為空字典:
      empty_set = set()
      

二、集合的常用操作

  1. 新增元素

    • 可以使用 add() 方法向集合中添加元素:
      my_set.add(5)  # my_set 現在是 {1, 2, 3, 4, 5}
      
  2. 刪除元素

    • 使用 remove()discard() 方法刪除元素。如果使用 remove() 刪除不存在的元素,會拋出錯誤;而 discard() 則不會:
      my_set.remove(3)  # my_set 現在是 {1, 2, 4, 5}
      my_set.discard(6)  # 不會拋出錯誤
      
  3. 集合的長度

    • 可以用 len() 函數來取得集合中元素的數量:
      print(len(my_set))  # 輸出: 4
      
  4. 清空集合

    • 使用 clear() 方法可以清空集合中的所有元素:
      my_set.clear()  # my_set 現在是 set()
      
  5. 檢查元素是否存在

    • 可以使用 in 關鍵字來檢查某個元素是否在集合中:
      if 2 in my_set:
          print("2 在集合中")
      

三、集合的數學運算

  1. 聯集(Union)

    • 使用 union()| 來取得兩個集合的聯集,包含兩個集合的所有元素:
      set_a = {1, 2, 3}
      set_b = {3, 4, 5}
      print(set_a.union(set_b))  # 輸出: {1, 2, 3, 4, 5}
      print(set_a | set_b)  # 同樣輸出 {1, 2, 3, 4, 5}
      
  2. 交集(Intersection)

    • 使用 intersection()& 來取得兩個集合的交集,返回兩個集合中都存在的元素:
      print(set_a.intersection(set_b))  # 輸出: {3}
      print(set_a & set_b)  # 同樣輸出 {3}
      
  3. 差集(Difference)

    • 使用 difference()- 來取得差集,返回在集合 A 中但不在集合 B 中的元素:
      print(set_a.difference(set_b))  # 輸出: {1, 2}
      print(set_a - set_b)  # 同樣輸出 {1, 2}
      
  4. 對稱差集(Symmetric Difference)

    • 使用 symmetric_difference()^ 來取得兩個集合的對稱差集,返回兩個集合中彼此不相交的元素:
      print(set_a.symmetric_difference(set_b))  # 輸出: {1, 2, 4, 5}
      print(set_a ^ set_b)  # 同樣輸出 {1, 2, 4, 5}
      

四、實際應用場景

  1. 資料去重

    • 集合的最大優勢在於自動去重。當你有一個包含重複項目的列表時,可以用集合來去除重複:
      numbers = [1, 2, 2, 3, 4, 4, 5]
      unique_numbers = set(numbers)
      print(unique_numbers)  # 輸出: {1, 2, 3, 4, 5}
      
  2. 資料庫中的聯集與交集操作

    • 當處理數據時,集合可以模擬數據庫中的「聯集」與「交集」操作,這對於資料過濾和比對來說非常實用。

五、Python 集合的優缺點

  1. 優點

    • 去重:自動去除重複數據。
    • 高效運算:集合在處理聯集、交集等操作時非常高效,特別適合用來處理大型數據集。
  2. 缺點

    • 無序:集合中的元素無法透過索引訪問,因此在需要保留順序的情況下不適合使用。

六、實作練習

練習 1:數據去重
  • 請設計一個程式,輸入一個含有重複元素的列表,並輸出去重後的集合。
練習 2:集合運算
  • 給定兩個隨機生成的數字集合,請實現聯集、交集、差集和對稱差集的運算,並輸出結果。

七、每日作業

  • 作業:撰寫一個程式來處理兩個班級的學生名單,並使用集合來找出:
    1. 同時參加兩個班級的學生
    2. 只參加其中一個班級的學生
    3. 兩個班級的所有學生

解答

這些實作練習主要練習 Python 中 集合set)的應用,集合是一個無序且不重複的數據結構,非常適合處理去重及集合運算。接下來我們將針對每個問題提供解答。

練習 1:數據去重

撰寫一個程式,讓使用者輸入一個含有重複元素的列表,並輸出去重後的集合。

def remove_duplicates(data_list):
    return set(data_list)

# 測試程式
data_list = input("請輸入一組數據,用逗號分隔: ").split(',')
print(f"去重後的集合是: {remove_duplicates(data_list)}")
練習 2:集合運算

給定兩個隨機生成的數字集合,實現聯集、交集、差集和對稱差集的運算,並輸出結果。

import random

# 隨機生成兩個集合
set1 = set(random.sample(range(1, 20), 10))
set2 = set(random.sample(range(1, 20), 10))

print(f"集合 1: {set1}")
print(f"集合 2: {set2}")

# 集合運算
union_set = set1.union(set2)
intersection_set = set1.intersection(set2)
difference_set = set1.difference(set2)
symmetric_difference_set = set1.symmetric_difference(set2)

# 輸出結果
print(f"聯集: {union_set}")
print(f"交集: {intersection_set}")
print(f"差集 (set1 - set2): {difference_set}")
print(f"對稱差集: {symmetric_difference_set}")
每日作業:處理兩個班級的學生名單

撰寫一個程式,輸入兩個班級的學生名單,並使用集合來找出:

  1. 同時參加兩個班級的學生
  2. 只參加其中一個班級的學生
  3. 兩個班級的所有學生
def student_analysis(class1, class2):
    class1_set = set(class1)
    class2_set = set(class2)
    
    both_classes = class1_set.intersection(class2_set)
    only_one_class = class1_set.symmetric_difference(class2_set)
    all_students = class1_set.union(class2_set)
    
    return both_classes, only_one_class, all_students

# 測試程式
class1 = input("請輸入班級 1 的學生名單,用逗號分隔: ").split(',')
class2 = input("請輸入班級 2 的學生名單,用逗號分隔: ").split(',')

both_classes, only_one_class, all_students = student_analysis(class1, class2)

print(f"同時參加兩個班級的學生: {both_classes}")
print(f"只參加其中一個班級的學生: {only_one_class}")
print(f"兩個班級的所有學生: {all_students}")

解釋:

  1. 練習 1:我們使用 Python 的集合特性來去重。透過 set() 將列表轉換為集合,可以自動去除重複項目。

  2. 練習 2:利用集合的內建方法(如 union, intersection, difference, symmetric_difference)來進行集合運算。這些方法非常方便地幫助你處理集合之間的關係。

  3. 每日作業:在這個作業中,使用了 intersection() 來找出同時在兩個班級中的學生,symmetric_difference() 找出只在一個班級中的學生,而 union() 則將兩個班級的學生名單合併。

  4. 一張展示聯集、交集、差集和對稱差集的 Venn 圖,清楚表達各種集合運算之間的關係。

  5. 一張展示使用集合來去除列表中重複元素的實例圖,展示操作前後的數據對比。


集合是 Python 中一個非常有用的資料結構,特別適合用來處理那些需要「唯一性」的情況。透過今天的學習,你將能掌握集合的基本操作以及其應用場景。

明日課程預告:將學習「Python 中的文件讀寫操作」。


上一篇
從 0 開始學!跟著 ChatGPT 學會 Python 函式&程式碼重用
下一篇
從 0 開始學!跟著 ChatGPT 學會 Python 中的文件讀寫操作
系列文
如果讓chatgpt參加iThome鐵人賽,他竟然寫出...!?14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言