主頁 > 後端開發 > python中set和frozenset方法和區別

python中set和frozenset方法和區別

2023-05-18 07:37:00 後端開發

set(可變集合)與frozenset(不可變集合)的區別:

set無序排序且不重復,是可變的,有add(),remove()等方法,既然是可變的,所以它不存在哈希值,基本功能包括關系測驗和消除重復元素. 集合物件還支持union(聯合), intersection(交集), difference(差集)和sysmmetric difference(對稱差集)等數學運算.
sets 支持 x in set, len(set),和 for x in set,作為一個無序的集合,sets不記錄元素位置或者插入點,因此,sets不支持 indexing, 或其它類序列的操作,
frozenset是凍結的集合,它是不可變的,存在哈希值,好處是它可以作為字典的key,也可以作為其它集合的元素,缺點是一旦創建便不能更改,沒有add,remove方法,

一、集合的創建

set()和 frozenset()工廠函式分別用來生成可變和不可變的集合,如果不提供任何引數,默認
會生成空集合,如果提供一個引數,則該引數必須是可迭代的,即,一個序列,或迭代器,或支持
迭代的一個物件,例如:一個串列或一個字典,

>>> s=set('cheeseshop')  #使用工廠方法創建
>>> s
{'h', 'c', 'o', 's', 'e', 'p'}
>>> type(s)
<type 'set'>
 
>>> s={'chessseshop','bookshop'}#直接創建,類似于list的[]和dict的{},不同于dict的是其中的值,set會將其中的元素轉換為元組
>>> s
{'bookshop', 'chessseshop'}
>>> type(s)
<type 'set'>
 
#不可變集合創建:
>>> t=frozenset('bookshop')
>>> t
frozenset({'h', 'o', 's', 'b', 'p', 'k'})

二、更新可變集合

用各種集合內建的方法和運算子添加和洗掉集合的成員:

>>> s.add('z')  #添加
>>> s
set(['c', 'e', 'h', 'o', 'p', 's', 'z'])
>>> s.update('pypi') #添加
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y', 'z'])
>>> s.remove('z') #洗掉
>>> s
set(['c', 'e', 'i', 'h', 'o', 'p', 's', 'y'])
>>> s -= set('pypi')#洗掉
>>> s
set(['c', 'e', 'h', 'o', 's'])
>>> del s  #洗掉集合

只有可變集合能被修改,試圖修改不可變集合會引發例外,

>>> t.add('z')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'frozenset' object has no attribute 'add'

三、成員關系 (in, not in)

 >>> 'k' in s
 False
 >>> 'k' in t
 True
 >>> 'c' not in t
 True

四、集合等價/不等價

>>> s == t
False
>>> s != t
True
>>> u = frozenset(s)
>>> s == u
True
>>> set('posh') == set('shop')
True

五、子集/超集

 >>> set('shop') < set('cheeseshop')
 True
 >>> set('bookshop') >= set('shop')
 True

六、遍歷訪問集合中的值(可變集合和非可變都支持)

>>> s=set('cheeseshop')
>>> s
{'h', 'c', 'o', 's', 'e', 'p'}
>>> for i in s:
    print(i)   
h
c
o
s
e
p
 
 
>>> t=frozenset('bookshop')
>>> t
frozenset({'h', 'o', 's', 'b', 'p', 'k'})
>>> for i in t:
    print(i)   
h
o
s
b
p
k

七、集合型別運算子(所有的集合型別)

1.聯合( | )

兩個集合的聯合是一個新集合,該集合中的每個元素都至少是其中一個集合的成員,即,屬于兩個集合其中之一的成員,聯合符號有一個等價的方法,union().

 >>> s | t
 set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

2.交集( & )

你可以把交集操作比做集合的 AND(或合取)操作,兩個集合的交集是一個新集合,該集合中的每個元素同時是兩個集合中的成員,即,屬于兩個集合的成員,交集符號有一個等價的方法,intersection()

>>> s & t
set(['h', 's', 'o', 'p']

3.差補/相對補集( – )

兩個集合(s 和 t)的差補或相對補集是指一個集合 C,該集合中的元素,只屬于集合 s,而不屬于集合 t,差符號有一個等價的方法,difference().

>>> s - t
set(['c', 'e'])

4.對稱差分( ^ )

和其他的布爾集合操作相似, 對稱差分是集合的 XOR(又稱"異或 ").
兩個集合(s 和 t)的對稱差分是指另外一個集合 C,該集合中的元素,只能是屬于集合 s 或者集合 t的成員,不能同時屬于兩個集合,對稱差分有一個等價的方法,symmetric_difference().

>>> s ^ t
set(['k', 'b', 'e', 'c'])

5.混合集合型別操作
上面的示例中,左邊的 s 是可變集合,而右邊的 t 是一個不可變集合. 注意上面使用集合操作運算子所產生的仍然是可變集合,但是如果左右運算元的順序反過來,結果就不一樣了:

>>> t | s
frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
>>> t ^ s#Python小白學習交流群:711312441
frozenset(['c', 'b', 'e', 'k'])
>>> t - s frozenset(['k', 'b'])

如果左右兩個運算元的型別相同, 既都是可變集合或不可變集合, 則所產生的結果型別是相同的,但如果左右兩個運算元的型別不相同(左運算元是 set,右運算元是 frozenset,或相反情況),則所產生的結果型別與左運算元的型別相同,

八、可變集合型別的方法

s.update(t) 用 t 中的元素修改 s, 即,s 現在包含 s 或 t 的成員
s.intersection_update(t) s 中的成員是共同屬于 s 和 t 的元素,
s.difference_update(t) s 中的成員是屬于 s 但不包含在 t 中的元素
s.symmetric_difference_update(t) s 中的成員更新為那些包含在 s 或 t 中,但不 是 s
和 t 共有的元素
s.add(obj) 在集合 s 中添加物件 obj
s.remove(obj) 從集合 s 中洗掉物件 obj;如果 obj 不是集合 s 中的元素(obj not
in s),將引發 KeyError 錯誤
s.discard(obj) 如果 obj 是集合 s 中的元素,從集合 s 中洗掉物件 obj;
s.pop() 洗掉集合 s 中的任意一個物件,并回傳它
s.clear() 洗掉集合 s 中的所有元素

九、集合型別運算子、函式和方法

函式/方法名 等價運算子 說明
所有集合型別:

len(s) 集合基數: 集合 s 中元素的個數
set([obj]) 可變集合工廠函式; obj 必須是支持迭代的,由 obj 中
的元素創建集合,否則創建一個空集合
frozenset([obj]) 不可變集合工廠函式; 執行方式和 set()方法相同,
但它回傳的是不可變集合
obj in s 成員測驗:obj 是 s 中的一個元素嗎?
obj not in s 非成員測驗:obj 不是 s 中的一個元素嗎?
s == t 等價測驗: 測驗 s 和 t 是否具有相同的元素?
s != t 不等價測驗: 與==相反
s < t (嚴格意義上)子集測驗; s != t 而且 s 中 所 有
的元素都是 t 的成員
s.issubset(t) s <= t 子集測驗(允許不嚴格意義上的子集): s 中所有的元素
都是 t 的成員
s > t (嚴格意義上)超集測驗: s != t 而且 t 中所有的元素
都是 s 的成員
s.issuperset(t) s >= t 超集測驗(允許不嚴格意義上的超集): t 中所有的元素
都是 s 的成員
s.union(t) s | t 合并操作: s 或 t 中的元素
s.intersec- tion(t) s & t 交集操作: s 和 t 中的元素
s.difference(t) s - t 差分操作: s 中的元素,而不是 t 中的元素
s.symmetric_difference(t)s ^ t 對稱差分操作:s 或 t 中的元素,但不是 s 和 t 共有
的元素
s.copy() 復制操作:回傳 s 的(淺復制)副本

僅用于可變集合:

s.update(t) s |= t (Union) 修改操作: 將 t 中的成員添加 s
s.intersection_update(t) s &= t 交集修改操作: s 中僅包括 s 和 t 中共有的成員
s.difference_update(t) s -= t 差修改操作: s 中包括僅屬于 s 但不屬于 t 的成員
s.symmetric_
difference_
update(t) s ^= t 對稱差分修改操作: s 中包括僅屬于 s 或僅屬于 t 的
成員
s.add(obj) 加操作: 將 obj 添加到 s
s.remove(obj) 洗掉操作: 將 obj 從 s 中洗掉;如果 s 中不存在
obj,將引發 KeyError
s.discard(obj) 丟棄操作: remove() 的 友 好 版 本 - 如
果 s 中存在 obj,
從 s 中洗掉它
s.pop() Pop 操作: 移除并回傳 s 中的任意一個元素
s.clear() 清除操作: 移除 s 中的所有元素

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552661.html

標籤:Python

上一篇:Python從零到壹丨帶你了解影像直方圖理論知識和繪制實作

下一篇:返回列表

標籤雲
其他(159165) Python(38148) JavaScript(25431) Java(18055) C(15228) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7191) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1938) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • python中set和frozenset方法和區別

    set(可變集合)與frozenset(不可變集合)的區別: set無序排序且不重復,是可變的,有add(),remove()等方法。既然是可變的,所以它不存在哈希值。基本功能包括關系測驗和消除重復元素. 集合物件還支持union(聯合), intersection(交集), difference( ......

    uj5u.com 2023-05-18 07:37:00 more
  • Python從零到壹丨帶你了解影像直方圖理論知識和繪制實作

    摘要:本文將從OpenCV和Matplotlib兩個方面介紹如何繪制直方圖,這將為影像處理像素對比提供有效支撐。 本文分享自華為云社區《[Python從零到壹] 五十.影像增強及運算篇之影像直方圖理論知識和繪制實作》,作者:eastmount。 一.影像直方圖理論知識 灰度直方圖是灰度級的函式,描述 ......

    uj5u.com 2023-05-18 07:36:36 more
  • Django authenticate() 函式查找不到與提交的用戶名和密碼匹配的

    在你的user APP下面添加一個utils.py檔案 class UsernameMobileBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): """ 重寫 ......

    uj5u.com 2023-05-18 07:36:20 more
  • < Python全景系列-3 > Python控制流程盤點及高級用法、神秘技巧

    全面深入地介紹 Python 的控制流程,包括條件陳述句、回圈結構和例外處理等關鍵部分,尤其會將串列決議、生成器、裝飾器等高級用法一網打盡。此外,我還將分享一些獨特的見解和研究發現,希望能給你帶來新的啟發。文章的結尾,我們將有一個 "One More Thing" 環節,我會分享一個很特別但又很少人知... ......

    uj5u.com 2023-05-18 07:36:15 more
  • python的pylightxl模塊

    pylightxl 比較小,沒有依賴,對python2、3都支持 https://pylightxl.readthedocs.io/en/latest/index.html pylightxl 的檔案,可以自己去查看 支持的檔案后綴:.xlsx, .xlsm 和.csv * 不支持.xls檔案(Mi ......

    uj5u.com 2023-05-18 07:36:09 more
  • Spring Cloud開發實踐(五): Consul - 服務注冊的另一個選擇

    Consul 是微服務網路解決方案之一, 用于管理跨網路和多云環境服務之間的安全網路連接, 提供服務發現, 服務網格, 流量管理和自動更新. 可以單獨部署, 也可以分布式部署. Consul 內建安全通信選項, 使用 Go 語言撰寫, 啟動資源消耗小, 腳本化配置, 對容器部署方式更友好 ......

    uj5u.com 2023-05-18 07:35:46 more
  • 我的第二次博客作業

    AZ-1的第二次博客作業 AZ-1 - 博客園 (cnblogs.com) 前言 題量 題目集4題量較小。 題目集5題量較小。 期中考試題量中等。 難度 題目集4雖然只有一道題,但是題目很長,難度很大,讓人在看到的時就心生畏懼。選單4在選單3的基礎上增加了大量的錯誤輸入,大大增加了程式的代碼量,很考 ......

    uj5u.com 2023-05-18 07:35:09 more
  • SpringBoot+MyBatis+MySQL電腦商城專案實戰(四)用戶注冊—控制層

    5 注冊-控制層 5.1 創建回應 狀態碼、狀態碼描述資訊、資料。這部分功能封裝到一個類中,將這類作為方法回傳值,回傳給前端瀏覽器。 package com.cy.store.util; import java.io.Serializable; /** * Json格式的資料進行回應 */ publ ......

    uj5u.com 2023-05-18 07:34:39 more
  • ThreadLocal 的原理講述 + 基于ThreadLocal實作MVC中的M層的事務

    ThreadLocal 的原理講述 + 基于ThreadLocal實作MVC中的M層的事務控制 每博一文案 生活不是努力了就可以變好的,喜歡做的事情也不是輕易就可以做的。以前總聽別人說, 堅持就好了,努力就好了,都會好的,可是真的做起來壓根就不是這樣。這種時候要怎么辦? 這種時候還能輕易地相信時間嗎 ......

    uj5u.com 2023-05-18 07:33:34 more
  • 認識Java

    Java的產生和發展 產生與發展歷程 1991年,由Sun公司開發Oak,最初為家用消費電子產品進行編程,是Java前身。 1994年,使用Oak語言撰寫了Web瀏覽器 1995年,改名為Java,96年發布JDK1.1 … 1998年,發布JDK1.2,從語言發展為平臺 … 2004年,發布JDK ......

    uj5u.com 2023-05-18 07:32:52 more