python集合的兩種類型_python 入門之 – 集合類型(十九)

在python中,集合是一個無序的,不重復的數據組合,他的主要工作如下:

1、去重,把一個列表變成集合,就自動去重了

2、關系測試,測試兩組數據之間的交集、差集、并集等關系

我來舉個例子,前兩個月出了iPhoneXS,去年出了iPhoneX,我現在想知道有多少人不僅去年買了iPhoneX今年也買了iPhoneXS,如下兩個數組:

iPhoneX = ['張三','李四','王五','趙六']

iPhoneXS = ['劉一','李四','周八','鄭十','張三']

我要得出兩部手機都買了的人按照之前學過的來做的話,肯定要兩部循環,如:

iPhoneX = ['張三','李四','王五','趙六']

iPhoneXS = ['劉一','李四','周八','鄭十','張三']

user = list()

for i in iPhoneX:

if i in iPhoneXS:

user.append(i)

print(user)

輸出結果為:['張三', '李四']

如果再更改需求,我需要把買過 iPhoneXS 和 iPhoneX 的人合并在一起,并且去除重復購買的人該怎么做呢,如果按照之前學過的幾種基本類型來做的話,我首先要再建立一個 數組,并且把買過 iPhoneX 和 iPhoneXS 的人拼接到一個數組中,然后根據已經得到的 user 循環判斷,刪除和 user 重復的所有數據,然后再把 user 拼接進去就得到了我想要的數據,思路是這樣沒錯,可是 python 還是嫌它太麻煩了,所以就有了一個 集合類型,來看看集合是怎么操作的:

首先語法和 字典 一樣都是{}號包裹著的,和字典不同的是,在字典里面是有key和value值的,而集合是沒有key的,他直接就是value值,如:

a = {1,2,3,4,5,6}

注意,如果集合內部沒有一個值,他默認是字典類型,我來做個測試判斷,如:

a = {1,2,3,4,5,6}

type(a)

>> #集合類型

a = {}

print(type(a))

>> #字典類型

集合中的內部元素有三個特性:

1、確定性(元素必須可 hash)

2、互異性(去重復)

3、無序性(集合中的元素沒有先后之分)

先看看它去重復的功能,還是用最上方的例子來解釋

iPhoneX = ['張三','李四','王五','趙六']

iPhoneXS = ['劉一','李四','周八','鄭十','張三']

arr = iPhoneX+iPhoneXS

print(set(arr))

>> {'趙六', '王五', '鄭十', '李四', '周八', '劉一', '張三'}

可以看到我直接用他的類型set()方法,就直接將一個數組去重并且轉成集合類型,同樣的我用數組的方法list再把它轉成數組就直接ok了:

iPhoneX = ['張三','李四','王五','趙六']

iPhoneXS = ['劉一','李四','周八','鄭十','張三']

arr = iPhoneX+iPhoneXS

print(list(set(arr)))

>> ['劉一', '趙六', '李四', '周八', '王五', '鄭十', '張三']

這就是集合的強大之處,一個簡單的操作完成了很多復雜的邏輯化處理,關于集合的基本操作方法確實還有很多,下面我來一一演示

add(需要增加的內容): 增加 (注意:這里只能添加一個值,如果添加多個值會報錯)

update(): 增加(增加多個值,如果重復了會被自動剔除,注意:這里的添加必須寫如一個數組)

pop(): 隨機刪除(注意:這里的可能在數據不多的情況下可能是刪除第一個或者最后一個,但是只要數據量足夠大,它一定是隨機刪除的)

remove(參數): 指定刪除(通過傳遞參數指定刪除某一個元素,注意:如果指定的元素不存在,則會報錯)

discard(參數): 指定刪除(通過傳遞參數指定刪除某一個元素,和remove()方法相反的是如果不存在,并不會報錯)

clear(): 清空整個集合

add():

a = {1,2,3,4,5}

a.add(6)

print(a)

>> {1,2,3,4,5,6}

a.add(2)

print(a)

>> {1,2,3,4,5,6} #已經存在的值是增加不進去的,集合的特性就是不重復

update():

a = {1,2,3,4,5}

a.update([4,5,6,7,8,9,0]) # 在 update 方法里面添加集合必須以數組的方式加進去

print(a)

>> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

pop():

a = {1,2,3,4,5,6,7,8,9,0}

a.pop()

print(a)

>> set({1, 2, 3, 4, 5, 6, 7, 8, 9})

remove():

a = {1,2,3,4,5,6,7,8,9,0}

a.remove(5)

print(a)

>> set({1, 2, 3, 4, 6, 7, 8, 9, 0}) #刪除完成后變量 a 已經沒有 5 這個變量值了

a.remove(5) #刪除沒有的元素在控制臺會報以下錯誤

>> Traceback (most recent call last):

File "", line 1, in

KeyError: 5

discard():

a = {1,2,3,4,5,6,7,8,9,0}

a.discard(5)

print(a)

>> set({1, 2, 3, 4, 6, 7, 8, 9, 0}) #刪除完成后變量 a 已經沒有 5 這個變量值了

a.discard(5) #控制臺并不會報錯

>>

clear():

a = {1,2,3,4,5,6,7,8,9,0}

a.clear()

print(a)

>> set() # 空集合

好了基本的集合類方法已經講解完畢了,其實上面說了這么多都是關于集合去重復的一些常規的增刪改查,其實集合還有一個關鍵的重點,那就是關系測試。

關系測試

關系測試分為交集、差集、并集這么幾種,可能很多朋友對這幾個關鍵詞比較迷惑,其實啊,在我看到交集、差集、并集這三種名稱的時候同樣的迷惑,先來了解以下這三種分別代表什么意思,在來說說集合能怎么處理這幾種關系測試。

交集:

如上方例子,再看下方示意圖,就是又買了iPhoneX也買了iPhoneXS的人,這樣類型的數據就是交集。

intersection(): 查找交集數據或這直接簡寫成&

intersection()

iPhoneX = ['張三','李四','王五','趙六']

iPhoneXS = ['劉一','李四','周八','鄭十','張三']

a = set(iPhoneX).intersection(set(iPhoneXS))

print(a)

>> {'張三', '李四'}

intersection()簡寫&

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

print(iPhoneX & iPhoneXS)

>> {'張三', '李四'}

差集:

我們已經知道了怎么獲取交集,什么又是差集呢,差集就是非交集的都算是差集,看到下圖,我現在能獲取到iPhoneX和iPhoneXS都買了的人但是我現在要獲取只買了iPhoneX和iPhoneXS的人,那么這種只買了iPhoneX和iPhoneXS的人就是差集,如下圖:

difference(): 查找差集數據或這直接簡寫成-

difference()

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

#查找只購買了 iPhoneX 的人

a = iPhoneX.difference(iPhoneXS)

print(a)

>> {'趙六', '王五'}

difference()簡寫–

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

#查找只購買了 iPhoneX 的人

a = iPhoneX - iPhoneXS

print(a)

>> {'王五', '趙六'}

并集:

并集其實很好理解,就是兩個集合全部相加在一起,然后去除重復的內容就叫并集

union(): 將兩個集合轉換成一個集合,并且去除重復的內容可以簡寫成|

union()

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

a = iPhoneX.union(iPhoneXS)

print(a)

>> {'張三', '趙六', '鄭十', '周八', '劉一', '王五', '李四'}

union()簡寫成|

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

a = iPhoneX | iPhoneXS

print(a)

>> {'張三', '趙六', '鄭十', '周八', '劉一', '王五', '李四'}

好了集合類型一共就是上方三種,可以算基本上完了,但是差集還有一個小知識點,那就是對稱差集

對稱差集

對稱差集又是什么呢?用上方的例子來說就是只取買了 iPhoneX 和 iPhoneXS 如果都買了就會被過濾掉,如果用上方的講過的幾個知識點來做的話,可能需要這樣做:

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

a = iPhoneX - iPhoneXS #iPhoneX 的差集

b = list(iPhoneXS - iPhoneX) #iPhoneXS 的差集并且轉成數組

a.update(b) 將數組 b 添加進集合 a 里

print(a)

>> {'王五', '鄭十', '周八', '劉一', '趙六'}

可以看到根據上方所學可以這樣就求出了只買了iPhoneX和iPhoneXS的人,直接過濾了兩者都買了的人。

其實上方代碼已經很簡潔了,可是python還是嫌棄他比較繁瑣,所以又提供了一個內置的方法:symmetric_difference()

symmetric_difference(): 求出對稱差集,可以簡寫成^

symmetric_difference()

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

a = iPhoneX.symmetric_difference(iPhoneXS)

print(a)

>> {'周八', '鄭十', '王五', '趙六', '劉一'}

symmetric_difference() 簡寫方案^

iPhoneX = {'張三','李四','王五','趙六'}

iPhoneXS = {'劉一','李四','周八','鄭十','張三'}

a = iPhoneX ^ iPhoneXS

print(a)

>> {'鄭十', '趙六', '王五', '劉一', '周八'}

可以看到,對稱差集就求出來了,接下來繼續往下看看集合的對應關系。

集合的對應關系

什么是集合的對應關系呢?舉個最簡單的例子:

一個城市的多級聯動,省級以下是市級的單位,市級以上是省級,那么在python里面省級就是市級的超集,市級就是省級的子集

這個時候我有一份省級的人物名單和好幾份市級的人名單,如:

Province = {'a','b','c','d','e','f','g'} #省級

city1 = {'w','e'} #城市一

city2 = {'f','e'} #城市二

city3 = {'j','k'} #城市三

city4 = {'z','k'} #城市四

city5 = {'a','h'} #城市五

我需要判斷這些市級有那些是屬于這個省級的子集那么該怎么做呢?python也為我們提供了可以判斷層級關系的內置方法:

issubset(): 判斷一個集合內的所有元素是否被包含在另一個集合內 (簡寫方式為<=)

issuperset(): 判斷一個集合內的元素是否包含了另一個集合的所有元素(和上方相反簡寫方式為>=)

根據這個城市的小例子,上方數據不是很多,一眼就可以看到只有城市二的所有元素,是省級單位都包括了的,所以其他的城市我就不測試了,直接用城市二來測試,如:

Province = {'a','b','c','d','e','f','g'} #省級單位

city2 = {'f','e'} #城市二

a = Province.issuperset(city2) #判斷省份里面是否包含了 市級

b = city2.issubset(Province) #判斷市級是否被包含在省級內

print(a)

print(b)

>> True

>> True

簡寫方式:

Province = {'a','b','c','d','e','f','g'} #省級單位

city2 = {'f','e'} #城市二

a = Province >= city2 #判斷省份里面是否包含了 市級

b = city2 <= Province #判斷市級是否被包含在省級內

print(a)

print(b)

>> True

>> True

python還為我們提供了一個方法用來判斷兩個集合是不是不相交的。

isdisjoint(): 用來判斷兩個集合是不是不相交的,如果相交,返回 False, 如果不相交,返回True

isdisjoint()

city2 = {'f','e'}

a = city2.isdisjoint(city2) #city2和它自身是相交的,所以返回的是 false ,只有不相交才會返回 true

print(a)

>> False

好了,還有最后兩個內置方法:

difference_update() : 差集賦值

intersection_update() : 交集賦值

difference_update()

a = {1,2,3,4,5,6,7,8,9,0}

b = {1,2,3,4,5,6,7}

a.difference_update(b) #將取到的差集賦值給 a 改變了 a 原有的值

print(a)

>> {0, 8, 9}

intersection_update()

a = {1,2,3,4,5,6,7,8,9,0}

b = {1,2,3,4,5,6,7}

a.intersection_update(b) #將取到的交集賦值給 a 改變了 a 原有的值

print(a)

好了關于集合類型基本上全部完了,加上前面的幾個章節基本上關于python的所有基本類型就徹底學完了要學習關于python新的知識了,你準備好了嗎?

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

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

相關文章

計算機數值計算的相關文章,數值計算論文.doc

數值計算論文PAGE \* MERGEFORMAT 13高斯消去法在電路分析中的應用—利用計算機求解一些復雜電路的參數雷嘉豪電子信息工程學院自動化一班100401102摘 要求解線性代數方程組的數值方法有很多&#xff0c;但歸納起來&#xff0c;可分為兩類&#xff1a;一種是直接法&#xff0c;…

bzoj 2756奇怪的游戲

2756: [SCOI2012]奇怪的游戲 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2571 Solved: 685[Submit][Status][Discuss]Description Blinker最近喜歡上一個奇怪的游戲。 這個游戲在一個 N*M 的棋盤上玩&#xff0c;每個格子有一個數。每次 Blinker 會選擇兩個相鄰的格子&…

秒懂,Java 注解 (Annotation)你可以這樣學

轉自: https://blog.csdn.net/briblue/article/details/73824058 文章開頭先引入一處圖片。 這處圖片引自老羅的博客。為了避免不必要的麻煩&#xff0c;首先聲明我個人比較尊敬老羅的。至于為什么放這張圖&#xff0c;自然是為本篇博文服務&#xff0c;接下來我自會說明。好了…

Java技術中的三大特性

為什么80%的碼農都做不了架構師&#xff1f;>>> 1&#xff0e;虛擬機 Java虛擬機JVM&#xff08;Java Virtual Machine&#xff09;在Java編程里面具有非常重要的地位&#xff0c;約相當…

matlab圖像增強分段線性函數_圖像增強、銳化,利用 PythonOpenCV 來實現 4 種方法!...

圖像增強目的使得模糊圖片變得更加清晰、圖片模糊的原因是因為像素灰度差值變化不大&#xff0c;圖片各區域產生視覺效果似乎都是一樣的&#xff0c; 沒有較為突出的地方&#xff0c;看起來不清晰的感覺解決這個問題的最直接簡單辦法&#xff0c;放大像素灰度值差值、使圖像中的…

python多人聊天室_Python基于Socket實現簡易多人聊天室

前言套接字(Sockets)是雙向通信信道的端點。 套接字可以在一個進程內&#xff0c;在同一機器上的進程之間&#xff0c;或者在不同主機的進程之間進行通信&#xff0c;主機可以是任何一臺有連接互聯網的機器。套接字可以通過多種不同的通道類型實現&#xff1a;Unix域套接字&…

計算機考研保護一志愿,考研良心大學,保護一志愿的考研名校!

大家好&#xff0c;我是&#xff0c;今天胖胖要跟大家送一些重要的干貨&#xff0c;就是對于選學校的小伙伴來說也好&#xff0c;或者是即將要參加研究生復試的小伙伴們來好胖胖在這里要跟大家說一個關于考研白名單的事情&#xff0c;因為大家都知道考研是會分黑名單和白名單&a…

python變量輸出到文件_使用函數將多個變量寫入文件

首先&#xff0c;要獲得當前正在執行的腳本名&#xff0c;或者更確切地說是調用函數的模塊&#xff0c;必須從堆棧跟蹤中獲取它。globals()-它將在writeToValues()函數的相同上下文中執行&#xff0c;因此它不會從“調用者”接收globals()。要糾正這種情況&#xff0c;您可以使…

嵌入式linux系統移植的四大步驟_嵌入式系統移植步驟

在嵌入式系統移植中重要的一部分是操作系統的移植&#xff0c;與其它操作系統相比&#xff0c;Linux大的特點&#xff1a;它是一款遵循GPL的操作系統&#xff0c;我們可以自由地使用、修改、和擴展它。正是由于這一特色&#xff0c;嵌入式系統移植過程中Linux系統受到越來越多人…

sdn框架的計算機網絡管理,清華SDN實踐--SDN 系統架構與數據中心應用

清華大學在SDN 的系統架構以及其在數據中心網絡中的應用方面展開了深入研究&#xff0c;主要研究成果包括&#xff1a;1. 以數據為中心的軟件定義網絡架構 SODA(Software Defined Data Centric Networking)。與 OpenFlow 相比&#xff0c;SODA 大大增強了數據層面的處理能力&am…

《軟件工程》課之-調查問卷的心得體會

1.這次調查是艱辛的。 2.很多人都誤以為我在發小廣告。。 3.很多人都不認識俄羅斯方塊1010這個游戲。 4.大家對于游戲的見解千奇百怪。 5.題目出的不是很完美&#xff0c;下次改進。。 6.簡單分析下結果&#xff0c;男孩子都喜歡多人的游戲&#xff0c;女孩的喜歡的多種多樣&am…

python循環語句for求和_for循環簡介

## for循環簡介for循環可以用來遍歷某一對象(遍歷&#xff1a;通俗點說&#xff0c;就是把這個循環中的第一個元素到最后一個元素依次訪問一次)。for循環的基本結構如下&#xff1a;![](https://img.kancloud.cn/75/33/753371a9536ed9eeb159074482ec85f0_558x174.png)說明&…

華為備份歷史版本_華為手機NAS備份時提示“需處于同一局域網”的解決方法

本內容來源于什么值得買APP&#xff0c;觀點僅代表作者本人 &#xff5c;作者&#xff1a;噩夢飄雷創作立場聲明&#xff1a;在使用華為手機向群暉NAS中備份時發現一直無法成功&#xff0c;經過一番研究找到了解決方案&#xff0c;希望能幫到大家~前言最近看了一位老哥的帖子&a…

計算機系統集成難點,企業MES實施中存在的難點及建議

MES是企業生產管理服務的核心信息化系統。實施MES是為了將現代企業生產管理思想、理念引入企業生產管理&#xff0c;對企業生產管理流程進行重組和優化&#xff0c;促進企業生產管理水平的提高。可是作用如此大的MES系統在實施過程中能一路無阻嗎&#xff1f;MES系統的作用1.車…

【原創】自己編寫的JavaGUI一鍵生成(hibernate/spring/mvc/maven)工具(附帶視頻教程源碼)...

為什么80%的碼農都做不了架構師&#xff1f;>>> 帶項目源碼&#xff08;https://git.oschina.net/qsyan/GeneratorFx&#xff09; app下載地址(附帶視頻教程)&#xff1a;http://download.csdn.net/detail/juyan2008/9769406 注明&#xff1a;此應用采用javafx編寫…

2018-2019 20165203 《信息安全系統設計基礎》第一周學習總結

2018-2019-1 20165203 《信息安全系統設計基礎》第一周學習總結 教材學習內容總結 編譯&#xff1a;gcc [選項] [文件名]選項參數表 參數對應功能-E僅執行編譯預處理-S將.c代碼轉換為匯編語言代碼-c僅執行編譯操作&#xff0c;不進行連接操作-o指定生成的輸出文件-I (大寫)指定…

普通計算機怎么算根號_大學專業介紹 | 計算機專業的真實就業情況

前兩天給大家簡單介紹了近些年比較火的計算機類相關專業具體都有哪些不同&#xff0c;以及就業時的行業或者崗位的側重點。今天呢我們繼續這個話題&#xff0c;來聊一聊整個計算機相關專業在學習和就業過程中大概是什么樣子的&#xff0c;希望能夠給大家提供一些實實在在的參考…

設計模式總結篇系列:工廠方法模式(Factory Method)

工廠方法模式適合于對實現了同一接口或繼承了同一父類的一些類進行實例的創建。一般是通過定義一個工廠類&#xff0c;并在其方法中實現對具有上述特點的類對象的創建。 根據具體產生類對象的方法定義形式&#xff0c;又可以將其分為普通工廠方法模式、多個工廠方法模式和靜態工…

高新園區到大連計算機學校,大連高新區中心小學

大連市高新區中心小學簡介&#xff1a;大連市高新區中心小學始建于2009年9月&#xff0c;是大連高新技術產業園區籌建的第一所直屬公辦學校。學校現擁有2000多名學生&#xff0c;87名教職員工。學校確定了“辦詩韻教育&#xff0c;讓每個孩子都幸福的教育理念”&#xff0c;通過…

java基礎之匿名內部類

內部類:   概述: 類里邊還有一個類, 里邊那個類叫內部類, 外邊那個類叫外部類.   分類:  成員內部類: 定義在成員位置的內部類.  局部內部類: 定義在局部位置的內部類. 格式:   new 類名或者接口名(){     //重寫類或者接口中 所有的 抽象方法;   };本質:  就…