Python高級數據類型:集合(Set)

集合是Python中一種非常有用的數據結構,它與列表類似但具有獨特的特性。本文將全面介紹集合的所有知識點,從基礎概念到高級用法,幫助初學者徹底掌握集合的使用。

1. 集合簡介

1.1 什么是集合?

集合(Set)是Python中的一種無序、不重復元素的容器。它類似于數學中的集合概念,具有以下主要特點:

  • 元素唯一性:集合中的元素不會重復

  • 無序性:元素沒有固定順序

  • 可變性:可以添加或刪除元素

  • 元素不可變性:集合中的元素必須是不可變類型(如數字、字符串、元組等)

1.2 為什么需要集合?

集合主要解決兩個問題:

  1. 去重:自動去除重復元素

  2. 關系運算:高效執行集合運算(交集、并集、差集等)

2. 集合的創建與基本操作

2.1 創建集合

# 方法1:使用花括號(注意與字典的區別)
s1 = {1, 2, 3, 2, 1}  # 自動去重,結果為{1, 2, 3}# 方法2:使用set()構造函數
s2 = set()  # 創建空集合
s3 = set([1, 2, 3, 2, 1])  # 從列表創建,結果為{1, 2, 3}# 方法3:從字符串創建(會拆分為字符)
s4 = set("hello")  # 結果為{'h', 'e', 'l', 'o'}

注意:創建空集合必須使用set(),因為{}表示空字典。

2.2 集合的元素特性

集合中的元素必須滿足:

  • 不可變:不能是列表、字典、集合等可變類型

  • 可哈希:必須實現__hash__方法

合法元素示例:

valid_set = {1, "hello", (1, 2, 3), True, 3.14}

非法元素示例:

invalid_set = {[1, 2], {"a": 1}, {1, 2}}  # 會報TypeError

2.3 集合的去重特性

集合自動去除重復元素:

numbers = [1, 2, 3, 2, 1, 4, 5, 4]
unique_numbers = set(numbers)  # 結果為{1, 2, 3, 4, 5}

3. 集合的基本操作

3.1 添加元素

s = {1, 2, 3}# 添加單個元素
s.add(4)  # s變為{1, 2, 3, 4}# 添加多個元素
s.update([5, 6, 7])  # s變為{1, 2, 3, 4, 5, 6, 7}
s.update({8, 9}, [10, 11])  # 可以混合添加

3.2 刪除元素

s = {1, 2, 3, 4, 5, 6}# 方法1:remove() - 刪除指定元素,不存在則報錯
s.remove(3)  # s變為{1, 2, 4, 5, 6}# 方法2:discard() - 刪除指定元素,不存在不報錯
s.discard(10)  # 無變化# 方法3:pop() - 隨機刪除并返回一個元素
item = s.pop()  # 隨機刪除一個元素# 方法4:clear() - 清空集合
s.clear()  # s變為set()

3.3 查詢操作

s = {1, 2, 3, 4, 5}# 檢查元素是否存在
print(3 in s)  # 輸出: True
print(6 not in s)  # 輸出: True# 獲取集合長度
print(len(s))  # 輸出: 5

3.4 集合的不可修改性

集合中的元素不能直接修改,因為集合是基于哈希表實現的。如果需要"修改"元素,只能先刪除再添加:

s = {1, 2, 3}# 錯誤做法(會報錯)
# s[0] = 10  # 正確做法:先刪除再添加
s.remove(1)
s.add(10)  # s變為{2, 3, 10}

4. 集合的關系運算

集合最強大的功能之一是能夠執行數學上的集合運算。

4.1 交集(Intersection)

返回兩個集合中都存在的元素。

s1 = {1, 2, 3}
s2 = {2, 3, 4}# 方法1:使用&運算符
print(s1 & s2)  # 輸出: {2, 3}# 方法2:使用intersection()方法
print(s1.intersection(s2))  # 輸出: {2, 3}

4.2 并集(Union)

返回兩個集合中所有不重復的元素。

# 方法1:使用|運算符
print(s1 | s2)  # 輸出: {1, 2, 3, 4}# 方法2:使用union()方法
print(s1.union(s2))  # 輸出: {1, 2, 3, 4}

4.3 差集(Difference)

返回只存在于第一個集合中的元素。

# 方法1:使用-運算符
print(s1 - s2)  # 輸出: {1}
print(s2 - s1)  # 輸出: {4}# 方法2:使用difference()方法
print(s1.difference(s2))  # 輸出: {1}

4.4 對稱差集(Symmetric Difference)

返回兩個集合中不相同的元素(即只存在于其中一個集合中的元素)。

# 方法1:使用^運算符
print(s1 ^ s2)  # 輸出: {1, 4}# 方法2:使用symmetric_difference()方法
print(s1.symmetric_difference(s2))  # 輸出: {1, 4}

4.5 子集與超集

判斷一個集合是否完全包含于或包含另一個集合。

a = {1, 2, 3}
b = {1, 2}# 子集判斷
print(b < a)  # 輸出: True(b是a的真子集)
print(b <= a)  # 輸出: True(b是a的子集或相等)# 超集判斷
print(a > b)  # 輸出: True(a是b的真超集)
print(a >= b)  # 輸出: True(a是b的超集或相等)# 方法形式
print(b.issubset(a))  # 輸出: True
print(a.issuperset(b))  # 輸出: True

4.6 集合相等性

判斷兩個集合是否包含相同的元素(不考慮順序)。

x = {1, 2, 3}
y = {3, 2, 1}print(x == y)  # 輸出: True
print(x != y)  # 輸出: False

5. 集合的高級用法

5.1 集合推導式

類似于列表推導式,可以快速生成集合。

# 基本語法
{expression for item in iterable}
{expression for item in iterable if condition}# 示例1:創建平方數集合
squares = {x**2 for x in range(10)}
# 輸出: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}# 示例2:篩選偶數平方
even_squares = {x**2 for x in range(10) if x % 2 == 0}
# 輸出: {0, 4, 16, 36, 64}# 示例3:字符串處理
words = ["hello", "world", "python"]
unique_chars = {char for word in words for char in word}
# 輸出: {'d', 'e', 'h', 'l', 'n', 'o', 'p', 'r', 't', 'w', 'y'}

5.2 凍結集合(frozenset)

frozenset是不可變集合,可以作為字典的鍵或另一個集合的元素。

fs = frozenset([1, 2, 3, 2, 1])  # 創建凍結集合# 可以作為字典的鍵
d = {fs: "frozen set"}  # 合法# 可以作為集合的元素
s = {fs, frozenset([4, 5, 6])}  # 合法

5.3 集合與列表的轉換

# 列表去重(常用技巧)
lst = [1, 2, 3, 2, 1, 4, 5, 4]
unique_lst = list(set(lst))  # 轉換為集合去重,再轉回列表# 注意:順序可能改變
print(unique_lst)  # 可能輸出: [1, 2, 3, 4, 5]

5.4 集合的性能優勢

集合基于哈希表實現,查找操作時間復雜度為O(1),遠快于列表的O(n)。

# 查找元素性能比較
big_list = list(range(1000000))
big_set = set(big_list)# 列表查找(慢)
%timeit 999999 in big_list  # 約10ms# 集合查找(快)
%timeit 999999 in big_set  # 約100ns

6. 集合的實際應用場景

6.1 數據去重

# 去除重復單詞
text = "hello world hello python world"
words = text.split()
unique_words = set(words)  # {'hello', 'world', 'python'}

6.2 關系測試

# 找出共同好友
alice_friends = {"Bob", "Charlie", "Diana"}
bob_friends = {"Alice", "Charlie", "Eve"}common_friends = alice_friends & bob_friends  # {'Charlie'}

6.3 成員快速查找

# 高效檢查元素是否存在
valid_users = {"alice", "bob", "charlie"}
username = input("請輸入用戶名: ")
if username in valid_users:print("歡迎回來!")
else:print("用戶名不存在")

6.4 過濾數據

# 篩選出只出現一次的元素
from collections import Counterdata = [1, 2, 3, 2, 1, 4, 5, 4, 6]
counts = Counter(data)
unique_elements = {x for x in data if counts[x] == 1}  # {3, 5, 6}

7. 集合與其他數據結構的比較

特性集合(set)列表(list)字典(dict)
有序性無序有序Python 3.7+有序
元素唯一性唯一可重復鍵唯一
可變性可變可變可變
元素類型必須不可變任意鍵必須不可變,值任意
查找速度O(1)O(n)O(1)
主要用途去重、關系運算有序數據存儲鍵值對映射

8. 常見問題與解答

Q1: 為什么集合是無序的?

集合基于哈希表實現,為了快速查找(O(1)時間復雜度),元素存儲位置由哈希值決定,因此不保持插入順序。

注意:Python 3.7+中,集合實際上保持了插入順序,但這被視為實現細節,不應依賴。

Q2: 集合和字典有什么關系?

集合相當于只有鍵沒有值的字典。實際上,Python的集合就是使用字典實現的,只是所有值都是None

Q3: 如何選擇使用列表還是集合?

  • 需要保持順序或允許重復 → 使用列表

  • 需要快速查找或去重 → 使用集合

  • 需要關系運算 → 使用集合

Q4: 為什么集合的元素必須是不可變的?

因為集合基于哈希表實現,可變對象無法生成固定哈希值,會導致集合內部結構混亂。

9. 練習題

練習1:去重統計

# 統計一段文本中不同單詞的數量
text = """Python is an easy to learn powerful programming language.
It has efficient high-level data structures and a simple but effective
approach to object-oriented programming. Python is easy to learn."""words = text.split()
unique_words = set(words)
print(f"不同單詞數量: {len(unique_words)}")

練習2:共同興趣

# 找出兩個人的共同興趣
alice_interests = {"reading", "hiking", "coding", "movies"}
bob_interests = {"coding", "movies", "gaming", "cooking"}common_interests = alice_interests & bob_interests
print(f"共同興趣: {common_interests}")

練習3:集合運算

# 給定三個集合,找出只在A中出現的元素
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7}
C = {5, 6, 7, 8}result = A - (B | C)
print(f"只在A中的元素: {result}")

10. 總結

集合是Python中非常有用的數據結構,主要特點包括:

  1. 元素唯一性:自動去重

  2. 無序性:元素沒有固定順序

  3. 高效查找:基于哈希表實現,查找速度O(1)

  4. 關系運算:支持交集、并集、差集等數學運算

  5. 元素限制:只能包含不可變類型

掌握集合的使用可以:

  • 簡化去重操作

  • 提高查找效率

  • 實現復雜的關系運算

  • 優化程序性能

建議在實際編程中多嘗試使用集合,特別是需要去重或快速查找的場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89535.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Unity編輯器開發GUI.Window】

Unity GUI.Window 筆記 根據官方文檔2021版本的&#xff0c;點擊鏈接跳轉記錄 概述 GUI.Window 是 Unity IMGUI 系統中用于創建彈出窗口的核心方法&#xff0c;具有以下關鍵特性&#xff1a; 浮動窗口&#xff1a;浮于普通 GUI 控件之上焦點控制&#xff1a;可通過點擊獲得焦…

CAN通信驅動開發注意事項

以下是CAN通信驅動開發的關鍵注意事項相關的整理,涵蓋硬件配置、協議實現、錯誤處理及性能優化等方面: 一、硬件層配置要點 引腳復用與時鐘 確認MCU的CAN控制器引腳是否與GPIO復用,正確配置復用模式。 檢查CAN控制器時鐘源,確保波特率計算基準準確。 收發器(Transceiver)…

CCF編程能力等級認證GESP—C++8級—20250628

CCF編程能力等級認證GESP—C8級—20250628單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;判斷題&#xff08;每題 2 分&#xff0c;共 20 分&#xff09;編程題 (每題 25 分&#xff0c;共 50 分)樹上旅行遍歷計數單選題&#xff08;每題 2 分&#xff0c;共 30…

135. Java 泛型 - 無界通配符

文章目錄135. Java 泛型 - 無界通配符 (?)**1. 什么是無界通配符 (?)&#xff1f;****2. 為什么使用無界通配符&#xff1f;****3. 示例&#xff1a;使用 ? 處理任意列表****? 錯誤示例****? 正確示例****4. 為什么 List<Object> 和 List<?> 不一樣&#xff…

NOIP提高組|2010T1機器翻譯

NOIP2010年提高組第一題:機器翻譯 題目描述 小晨的電腦上安裝了一個機器翻譯軟件,他經常用這個軟件來翻譯英語文章。 這個翻譯軟件的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換。對于每個英文單詞,軟件會先在內存中查找這個單詞的中文含義,如果…

Change Data Capture (CDC) with Kafka Connect:實時數據同步的完整指南

Change Data Capture (CDC) 是一種高效的數據同步技術&#xff0c;能夠捕獲數據庫的變更&#xff08;插入、更新、刪除&#xff09;并實時傳輸到其他系統。結合 Kafka Connect&#xff0c;我們可以構建一個可靠、可擴展的 CDC 管道&#xff0c;實現數據庫與數據湖、數據倉庫或消…

云手機網絡加速全攻略:解決游戲卡頓與APP連接失敗困擾

用云手機玩游戲、掛腳本、跑自動任務&#xff0c;明明后臺顯示在線&#xff0c;但畫面卡頓、操作延遲、甚至APP直接“轉圈圈連不上”&#xff0c;是不是很抓狂&#xff1f;問題出在哪里&#xff1f;云手機不卡&#xff0c;網絡卡&#xff1f;其實&#xff0c;大多數云手機的性能…

從“數字土著”到“數據公民”:K-12數據倫理課程的設計、實施與成效追蹤研究

一、引言 1.1 研究背景與意義 在當今數字時代&#xff0c;信息技術以前所未有的速度滲透到社會的各個領域&#xff0c;深刻地改變了人們的生活、工作和學習方式。K-12 教育作為基礎教育的關鍵階段&#xff0c;也在數字化浪潮的推動下發生著巨大的變革。隨著大數據、人工智能…

LVS詳解

LVS(Linux virtual server)簡介即linux虛擬服務器四層負載均衡基本上都會使用 LVS&#xff0c;據了解 BAT 等大廠都是 LVS 重度使用者&#xff0c;就是因為 LVS 非常出色的性能&#xff0c;能為公司節省巨大的成本。LVS&#xff0c;全稱 Linux Virtual Server 是由國人章文嵩博…

Linux內核設計與實現 - 第5章 系統調用

目錄一、系統調用概述二、系統調用實現機制四、性能優化技術五、常見問題排查六、安全注意事項一、系統調用概述 定義 用戶空間訪問內核功能的唯一合法入口提供硬件抽象接口&#xff0c;保證系統穩定和安全 與API區別 特性系統調用API執行層級內核態用戶態實現方式軟中斷(int …

紙板制造糊機操作

糊機操作技巧:開機流程&#xff1a;首先&#xff0c;一切的一切&#xff0c;要看懂生管&#xff0c;我們要用哪個楞別&#xff0c;再看哪個門幅和材質。 也就是說&#xff0c;一切的一切&#xff0c;要生產了&#xff0c;原紙不能用錯了吧&#xff01; 第一步&#xff1a; 壓壓…

WPF 多窗口分文件實現方案

WPF 多窗口分文件實現方案 項目文件結構 WindowSwitcher/ ├── App.xaml ├── App.xaml.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Views/ │ ├── SettingsWindow.xaml │ ├── SettingsWindow.xaml.cs │ ├── DataWindow.xaml │ ├─…

在服務器(ECS)部署 MySQL 操作流程

在部署 MySQL 數據庫之前需要準備好服務器環境。可以通過以下兩種方式來準備部署服務器&#xff1a;云服務器&#xff08;ECS&#xff09;&#xff0c;如&#xff1a;阿里云、華為云、騰訊云等。IDC服務器。 現以阿里云服務器&#xff08;ECS&#xff09;Windows版本來進行部署…

Java File 類詳解:從基礎操作到實戰應用,掌握文件與目錄處理全貌

作為一名 Java 開發工程師&#xff0c;你一定在實際開發中遇到過需要操作文件或目錄的場景&#xff0c;例如&#xff1a;讀寫配置文件、上傳下載、日志處理、文件遍歷、路徑管理等。Java 提供了 java.io.File 類來幫助開發者完成這些任務。本文將帶你全面掌握&#xff1a;File …

嵌入式學習-PyTorch(9)-day25

進入尾聲&#xff0c;一個完整的模型訓練 &#xff0c;點亮的第一個led#自己注釋版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

用AI做帶貨視頻評論分析進階提分【Datawhale AI 夏令營】

文章目錄回顧賽題優化1??優化2??回顧賽題 模塊內容類型說明/示例賽題背景概述參賽者需構建端到端評論分析系統&#xff0c;實現商品識別、多維情感分析、評論聚類與主題提煉三大任務。商品識別輸入video_desc&#xff08;視頻描述&#xff09; video_tags&#xff08;標簽…

Redis常見數據結構詳細介紹

Redis 作為一款高性能的開源內存數據庫&#xff0c;憑借其豐富多樣的數據結構和出色的性能&#xff0c;在緩存、會話存儲、實時分析等眾多場景中得到了廣泛應用。下面將詳細介紹 Redis 主要的數據結構&#xff0c;包括它們的類型、具體用法和適用場景。1、字符串&#xff08;St…

HAMR硬盤高溫寫入的可靠性問題

熱輔助磁記錄(HAMR)作為突破傳統磁記錄密度極限的下一代存儲技術,其在數據中心大規模應用的核心挑戰在于可靠性保障。 擴展閱讀: 下一個存儲戰場:HAMR技術HDD HAMR技術進入云存儲市場! 漫談HAMR硬盤的可靠性 隨著存儲密度向4Tbpsi邁進,傳統磁記錄技術遭遇"三難困境…

使用llama-factory進行qwen3模型微調

運行環境 Linux 系統(ubuntu) Gpu (NVIDIA) 安裝部署 llama factory CUDA 安裝 首先,在 https://developer.nvidia.com/cuda-gpus 查看您的 GPU 是否支持CUDA 保證當前 Linux 版本支持CUDA. 在命令行中輸入 uname -m && cat /etc/*release,應當看到類似的輸出 x8…

tcp/udp調試工具

幾款tcp/udp調試工具 下載地址&#xff1a;夸克網盤