Python的集合

来源:http://www.cnblogs.com/qtyun/archive/2017/12/18/8052079.html
-Advertisement-
Play Games

1. Python的集合 1.1 集合的定義 在Python中, 集合set是基本數據類型的一種集合類型,它有可變集合(set())和不可變集合(frozenset)兩種。Python中的集合set類似列表,但每個元素都必須時獨一無二的,無序的。 集合set是無序的、不重覆的,是可變的,有add() ...


1. Python的集合

1.1 集合的定義

  在Python中, 集合set是基本數據類型的一種集合類型,它有可變集合(set())和不可變集合(frozenset)兩種。Python中的集合set類似列表,但每個元素都必須時獨一無二的,無序的。

  集合set是無序的、不重覆的,是可變的,有add(),remove()等方法。由於集合set是可變的,所以它不存在哈希值。基本功能包括關係測試和消除重覆元素。集合對象還支持union(聯合)、 intersection(交集)、 difference(差集)和sysmmetric difference(對稱差集)等數學運算。

  集合set支持 N in set, len(set),和 for N in set。作為一個無序的集合,集合set不記錄元素位置或者插入點。因此,集合set不支持 indexing, 或其它類序列的操作。

  集合frozenset()是凍結的集合,它是不可變的,存在哈希值,優點是它可以作為字典的key,也可以作為其它集合的元素。缺點是一旦創建便不能更改,沒有add(),remove()方法。

  因此,Python中集合的作用主要是:去重,把一個列表變成集合,就自動去重;關係測試,測試兩組數據之間的交集、差集、並集等關係。

 

1.2 集合的操作

  在Python中,集合set的常用操作包括:創建集合set、集合set增加、集合set刪除、集合的交集、集合的並集、集合的差集等。

 

1.2.1 集合的創建

  在Python中,集合的創建可以使用集合的工廠函數set()和frozenset(),但是,set()創建的集合時可變的,frozenset()創建的集合時不可變的,其語法格式分別如下:

  集合名 = set(集合值)

       集合名 = frozenset(集合值)  

  

  (1)創建空集合

  在Python中,當不指定集合的值時,使用工廠函數set()和frozenset()即可創建一個空集合。

  例如,創建空集合。  

  代碼:

1 a =set()
2 b = frozenset()
3 print(a)
4 print(b)

  運行結果:

1 set()
2 frozenset()

 

  (2)用set()方法創建集合  

  例如,用set()方法創建一個0到10之間的奇數的集合,並列印出來。

  代碼:

1 number_odd = []
2 for number in range(1,11,2):
3     number_odd.append(number)
4 number_opp_set =set(number_odd)
5 print(number_opp_set)

  說明:

  第1行,創建一個空列表。

  第2~3行,用函數range()迴圈生成0到10之間的奇數,然後增加到空列表中。

  第4行,將列表中的值傳給方法set(),生成一個集合。

 

  運行結果:

1 {1, 3, 5, 7, 9}

  以上的代碼可以通過列表解析的方式優化為:

  代碼1:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)

  說明:

  因為Python是解釋性語言,代碼越少,解釋花費的時間也少。

 

  運行結果1:

1 {1, 3, 5, 7, 9} 

 

 (3)用frozenset()方法創建集合  

  例如,用frozenset()方法創建一個0到10之間的奇數的集合,並列印出來。

  代碼:

1 number_opp_set_0 =frozenset(number for number in range(1,11,2))
2 print(number_opp_set_0)

 

  運行結果:

1 frozenset({1, 3, 5, 7, 9})

 

1.2.2  集合的增加

  在python中,集合的增加有兩種常用方法:add()方法和update()方法。

  (1) add()方法

  集合的add()方法是把要傳入的元素做為一個整體增加到集合中,即實現單元素增加。

  例如,定義一個0到10的奇數的集合,然後再用add()方法往裡面增加一個偶數2和18,然後再列印出來。

  代碼:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_opp_set.add(2)
4 number_opp_set.add(18)
5 print(number_opp_set)

  說明:

  第3、4行,都是時使用add()方法分別向集合中增加偶數2和18。

  

  運行結果:

1 {1, 3, 5, 7, 9}
2 {1, 2, 3, 5, 7, 9, 18}

 

  (2)update()方法

  集合update()方法是把要傳入的元素拆分,做為單個個體增加到集合中,即多元素增加。

  例如,定義一個0到10的奇數的集合,然後再用update()方法往裡面增加一個偶數2和18,然後再列印出來。

  代碼:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_opp_set.update('2')
4 number_opp_set.update('18')
5 print(number_opp_set)

  說明:

  第3、4行,分別調用update()方法分別向集團中增加偶數2和18.

 

  運行結果:

1 {1, 3, 5, 7, 9}
2 {1, 3, 5, 7, 9, '2', '8', '1'}

  從以上的運行結果中可知,偶數18倍拆分為1和8分別增加到集合中,並且增加的值都被單引號引起來,這表示增加的是字元竄。這並不是我們需要的結果。

  在Python中,如果調用update()方法向集合中增加兩個或多個字元組成的值時,該值需要使用中括弧或者花括弧括起來,即表示為字典或列表的形式。

  例如,定義一個0到10的奇數的集合,然後再用update()方法往裡面增加一個偶數2和18,即奇數19,然後再列印出來。

  代碼:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_opp_set.update('2')
4 number_opp_set.update(['18'])
5 number_opp_set.update({'19'})
6 print(number_opp_set)

 

  運行結果:

1 {1, 3, 5, 7, 9}
2 {1, 3, 5, 7, 9, '18', '2', '19'}

 

1.2.3 集合的刪除

  在Python中,集合的刪除分為兩種,一種是刪除集合中的值;一種是刪除整個集合。

  (1)刪除整個集合

  在Python中,當我們需要刪除整個集合中時,可使用del 語句直接刪除。

  例如,將1.2.2 中創建的集合刪除。

  代碼:

1 number_opp_set =set(number for number in range(1,11,2))
2 print("集合刪除前:",number_opp_set)
3 del  number_opp_set
4 print("集合刪除後:",number_opp_set)

  說明:

  第2行,使用del語句刪除集合number_opp_set。

 

  運行結果:

1 集合刪除前: {1, 3, 5, 7, 9}
2 Traceback (most recent call last):
3   File "F:/PyProject/s14/day2/test_set.py", line 6, in <module>
4     print("集合刪除後:",number_opp_set)
5 NameError: name 'number_opp_set' is not defined

  從以上的運行結果可知,使用del語句刪除集合時一種永久性的,刪除後就集合就不能再被使用。

 

  (2)刪除集合中的值

  在Python中,當我們需要刪除集合中的值時,可使用remove()方法。

  例如,將1.2.2 中增加到集合中的值刪除。

  代碼:

 1 number_opp_set =set(number for number in range(1,11,2))
 2 print(number_opp_set)
 3 number_opp_set.update('2')
 4 number_opp_set.update(['18'])
 5 number_opp_set.update({'19'})
 6 print(number_opp_set)
 7 number_opp_set.remove('2')
 8 number_opp_set.remove('18')
 9 number_opp_set.remove('19')
10 print(number_opp_set)

  說明:

  第7、8、9行,分別調用remove()方法分別從集合中刪除前面增加到集合中的值,並且remove中的參數必須用引號引起來,否則Python解釋器無法解析,會提示錯誤。

 

  運行結果:

1 {1, 3, 5, 7, 9}
2 {1, 3, 5, 7, '18', 9, '2', '19'}
3 {1, 3, 5, 7, 9}

 

1.2.3 集合的訪問

  在Python中,集合的訪問主要有兩種,一種是訪問整個集合,一種的集合的遍歷。

  (1)訪問整個集合

  在Python中,訪問整個集合,可以直接使用。

  例如,創建一個1到10之間的數字組成的偶數的集合,並訪問整個集合。

  代碼:

1 number_even_set =set(number for number in range(2,11,2))
2 print(number_even_set)

  說明:

  第1行,使用range()函數和for迴圈,從2開始,依次遍歷到10,且步長為2,再用set()方法,將所有遍歷過程中滿足步長為2的數字創建為一個集合。

  第2行,直接用print列印整個集合。

 

  運行結果:

1 {2, 4, 6, 8, 10}

 

  (2)訪問集合中的每個值

  在Python中,我們可以使用for迴圈來遍歷訪問集合中的每個值。

  例如,創建一個1到10之間的數字組成的偶數的集合,並遍歷訪問集合中的每個值。

  代碼:

1 number_even_set =set(number for number in range(2,11,2))
2 print(number_even_set)
3 for number_evven in number_even_set:
4     print(number_evven)

 

  運行結果:

1 {2, 4, 6, 8, 10}
2 2
3 4
4 6
5 8
6 10

 

1.3 集合的關係測試

  在Python中,集合的關係測試包括:並集、交集、差集等等。

1.3.1 並集

  集合中,並集也叫合集,即將一個集合和另一個集合合併為一個集合的過程。求並集使用函數union()。

  例如,創建一個1到10之間的數字組成的偶數的集合和奇數集合,然後求其並集。

  代碼:

1 number_opp_set =set(number for number in range(1,11,2))
2 print(number_opp_set)
3 number_even_set =set(number for number in range(2,11,2))
4 print(number_even_set)
5 number_set = number_opp_set.union(number_even_set)
6 print(number_set)

  說明:

  第5行,用函數union()將集合number_opp_set和集合number_even_set合併後賦值給變數number_set。

  

  運行結果:

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

  從以上的運行結果可知,通過函數union()將兩個集合合併為一個集合。

 

1.3.2 交集

  交集就是兩個集合中都有的部分,用函數intersection()求兩個集合的交集。

  例如,創建一個1到5的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其交集。

  代碼:

1 number_set_a =set(number for number in range(1,6))
2 print(number_set_a)
3 number_opp_set =set(number for number in range(1,11,2))
4 print(number_opp_set)
5 number_set = number_set_a.intersection(number_opp_set)
6 print(number_set)

  說明:

  第5行,使用函數intersection()求集合number_set_a和集合number_opp_set的交集。

 

  運行結果:

1 {1, 2, 3, 4, 5}
2 {1, 3, 5, 7, 9}
3 {1, 3, 5}

  從以上的運行結果可知,通過函數intersection()已經把兩個集合的公共部分求出來了。

 

1.3.3 差集

  差集就是在兩個集合中,在集合a中有,但集合b中沒有的部分,或者集合b中有,但集合a中沒有的部分。

  例如,創建一個1到5的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其差集。

  代碼:

1 number_set_a =set(number for number in range(1,6))
2 print(number_set_a)
3 number_opp_set =set(number for number in range(1,11,2))
4 print(number_opp_set)
5 number_set = number_set_a.difference(number_opp_set)
6 print(number_set)
7 _number_set = number_opp_set.difference(number_set_a)
8 print(_number_set)

  說明:

  第5行,使用函數difference()求集合number_set_a中有,但集合number_opp_set中沒有的部分,並賦值給變數number_set。

  第7行,使用函數difference()求集合number_opp_set中有,但集合number_set_a中沒有的部分,並賦值給變數_number_set。

 

  運行結果:

1 {1, 2, 3, 4, 5}
2 {1, 3, 5, 7, 9}
3 {2, 4}
4 {9, 7}

 

1.3.4 子集

  判斷集合a是否是集合b的子集,使用函數issubset()。

  例如,創建一個1到10的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其子集。

  代碼:

1 number_set_a =set(number for number in range(1,11))
2 print(number_set_a)
3 number_opp_set =set(number for number in range(1,11,2))
4 print(number_opp_set)
5 number_set = number_set_a.issubset(number_opp_set)
6 print(number_set)
7 _number_set = number_opp_set.issubset(number_set_a)
8 print(_number_set)

  說明:

  第5行,判斷集合number_set_a是否是集合number_opp_set的子集,判斷結果賦值給變數number_set。

  第7行,判斷集合number_opp_set是否是集合number_set_a的子集,判斷結果賦值給變數_number_set。

 

  運行結果:

1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2 {1, 3, 5, 7, 9}
3 False
4 True

 

1.3.5 父集

  判斷集合a是否是集合b的父集,使用函數issuperset()。

  例如,創建一個1到10的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其父集。

  代碼:

1 number_set_a =set(number for number in range(1,11))
2 print(number_set_a)
3 number_opp_set =set(number for number in range(1,11,2))
4 print(number_opp_set)
5 number_set = number_set_a.issuperset(number_opp_set)
6 print(number_set)
7 _number_set = number_opp_set.issuperset(number_set_a)
8 print(_number_set)

  說明:

  第5行,判斷集合number_set_a是否是集合number_opp_set的父集,判斷結果賦值給變數number_set。

  第7行,判斷集合number_opp_set是否是集合number_set_a的父集,判斷結果賦值給變數_number_set。

 

  運行結果:

1 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2 {1, 3, 5, 7, 9}
3 True
4 False

 

1.3.5 對稱差集

  對稱差集就是求兩個集合中的剔除公共的部分的集合。

  例如,創建一個1到5的數字組成的集合,再創建一個0到10的奇數組成的集合,然後求其對稱差集。

  代碼:

1 number_set_a =set(number for number in range(1,6))
2 print(number_set_a)
3 number_opp_set =set(number for number in range(1,11,2))
4 print(number_opp_set)
5 number_set = number_set_a.symmetric_difference(number_opp_set)
6 print(number_set)
7 _number_set = number_opp_set.symmetric_difference(number_set_a)
8 print(_number_set)

  說明:

  

  第5行,使用函數symmetric_difference()求集合number_set_a和集合number_opp_set的對稱差集,並賦值給變數number_set。

  第7行,使用函數symmetric_difference()求集合number_opp_set和集合number_set_a的對稱差集,並賦值給變數_number_set。

  

  運行結果:

1 {1, 2, 3, 4, 5}
2 {1, 3, 5, 7, 9}
3 {2, 4, 7, 9}
4 {2, 4, 7, 9}

  從以上的運行結果可知,求兩個集合的對稱差集時,哪個集合寫在函數中都行,其結果都一樣。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於某些特定的業務場景,當多個小程式需要一個服務端後臺提供數據時,大家可能想到是HTTP路由。是的,實際上我們使用微服務的GateWay網關也是一樣的,如下圖微服務架構: 網關GateWay的作用在於提供統一的入口來訪問內部的API, 隔離外部訪問與內部系統。集成了非業務性的功能(如安全檢查、頻次限... ...
  • 一:介紹 愛回收是一個和京東回收類似的產品,本質是將用戶不需要的手機,電腦,數位產品等進行回收,我之前使用京東回收過冰箱,感覺京東回收做得蠻好的,通過手機就能搞定一切,然而愛回收我是在兩個月前逛街無意發現的,看到很多年輕人去愛回收提供的設備上搜索商品,它和京東最大的不同是,在查詢回收商品現場,有工作 ...
  • php7從推出到現在,前兩天官方已經發佈到7.2版本,把自己升級和安裝php7中遇到的問題和解決方法做一個筆記,內容主要包括:1) mysql2) php3) nginx4) memcache擴展5) redis擴展 由於內容很長,會分為多篇文章來講述,當然你可能遇到比我更多的問題需要解決,因為我們 ...
  • 指能夠被內置函數`next`調用並不斷返回下一個值,直到最後拋出`StopIteration`錯誤表示無法繼續返回下一個值的對象稱為迭代器(`Iterator`) ...
  • 1002. 寫出這個數 (20) 讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。 輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1空格,但一行中最後一個拼音數字後沒有空格。 輸 ...
  • 你們單位在國外搞了個伺服器,立足於美利堅,受美國法律保護。用來存放你懂的資源,以圖片和電影為主。最近流量非常可觀,為了更好的服務客戶,改善用戶體驗。 你們老闆決定增加一個投票區,用戶可以給自己喜愛的作品投票,每個月評出最喜愛作品,並且從用戶中挑選3名用戶作為獲獎用戶,獎品為蒼老師簽名寫真集。這還不簡 ...
  • 一 python的一些語言規範 再寫腳本的時候我們會寫以上的“註釋行”先來看看它們的意思。 1:調用usr/bin/下的python解釋器去解釋執行你寫的python腳本; 2:系統會自己去找系統中的解釋器去執行; 3:告訴系統編碼方式;(下麵再講其它的編碼方式) 當然,linux系統下預設是安裝了 ...
  • Exchanger,併發工具類,線程協作,用於線程間的數據交換。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...