Python 簡明教程 ---13,Python 集合

微信公衆號:碼農充電站pro
個人主頁:https://codeshellme.github.io

如果代碼和註釋不一致,那很可能兩者都錯了。
—— Norm Schryer

目錄

在這裏插入圖片描述

前幾節我們已經介紹了Python 中的列表list元組tuple字典dict,本節來介紹Python 中的最後一種數據結構——集合set

>>> set
<type 'set'>

1,Python 集合

Python 中的setdict 很像,唯一的不同是,dict 中保存的是鍵值對,而set 中只保存,沒有

Python 集合有如下特點:

  • 集合中的元素是唯一的,不重複
  • 集合中的元素是無序
  • 集合中的元素可以是任意一種不可變類型,比如字符串數字元組
  • 集合中的元素可以動態的增加/刪除
  • Python 會在需要的時候自動的擴容縮容集合,方便開發者使用

2,聲明集合

Python 集合的聲明有兩種方式:

  • 使用set() 創建集合,() 中可爲空,也可以是任意的可迭代類型,比如列表元組字典
  • 使用大括號{}創建集合,從該創建方式上也能看出集合字典很像

創建空集合時,只能用set(),而不能用{}

>>> s = set()  # 空集合
>>> s
set()
>>> s = {}     # 空的 {} 會被解析成字典
>>> s
{}

創建非空集合時,可以用set(),也可以用{}

>>> s = {1, 'abc', 1.5}       # 用 {} 創建集合
>>> s
{1, 'abc', 1.5}
>>> s = set([1, 'abc', 1.5])  # 用列表創建集合
>>> s
{1, 'abc', 1.5}
>>> s = set((1, 'abc', 1.5))  # 用元組創建集合 
>>> s
{1, 'abc', 1.5}
>>> s = set({'a':1, 'b':2, 'c':3}) # 用字典創建集合
>>> s                              # 只會包含字典中的鍵
{'c', 'b', 'a'}

由於集合中的元素是唯一的,如果初始化時的可迭代數據中有重複的元素,則會自動刪去重複的元素:

>>> s = set([1, 2, 2, 3])  # 列表中有兩個 2
>>> s                      # 集合中只有一個 2
{1, 2, 3}

3,集合元素個數

使用len() 函數可以查看集合中元素的個數:

>>> s = set([1, 'abc', 1.5])
>>> s
{1, 'abc', 1.5}
>>> len(s)   # 元素個數
3

4,訪問集合元素

由於Python 集合中的元素的是無序的,所以可不能使用下標 的方式來訪問集合中的單個元素。

我們可以使用for 循環 來遍歷集合中的所有元素:

>>> s = set([1, 'abc', 1.5])
>>> for i in s:
...     print(i)
... 
1
abc
1.5

5,集合運算

我們可以對兩個集合進行如下運算:

  • & 運算:計算集合的交集
  • | 運算:計算集合的並集
  • in 運算:判斷某個元素是否在集合中

交集與並集

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2   # 交集
{2, 3}
>>> s1 | s2   # 並集
{1, 2, 3, 4}

in 運算

>>> s = set([1 , 2, 3])
>>> 1 in s
True
>>> 2 not in s
False

6,集合函數

使用dir(set) 查看集合支持的所有方法:

>>> dir(set)
['__and__', '__class__', '__contains__', 
'__delattr__', '__dir__', '__doc__', 
'__eq__', '__format__', '__ge__', 
'__getattribute__', '__gt__', '__hash__', 
'__iand__', '__init__', 
'__init_subclass__', '__ior__', 
'__isub__', '__iter__', '__ixor__', 
'__le__', '__len__', '__lt__', '__ne__', 
'__new__', '__or__', '__rand__', 
'__reduce__', '__reduce_ex__', 
'__repr__', '__ror__', '__rsub__', 
'__rxor__', '__setattr__', '__sizeof__', 
'__str__', '__sub__', '__subclasshook__', 
'__xor__', 
'add', 'clear', 'copy', 'difference', 
'difference_update', 'discard', 
'intersection', 'intersection_update', 
'isdisjoint', 'issubset', 'issuperset', 
'pop', 'remove', 'symmetric_difference', 
'symmetric_difference_update', 'union', 
'update']

下面一一介紹這些非魔法方法,共17 個。

1.add 方法

作用:向集合S 中添加元素
原型:S.add(…) -> None
參數:任意不可變類型數據
返回值: 總是返回 None

由於集合中的元素是唯一的,向集合中添加元素時有兩種情況:

  • 添加的元素集合中不存在:只要元素類型合法,就會成功添加進去
  • 添加的元素集合中已存在:不會對集合進行任何操作

示例:

>>> s = set([1, 3, 5]) # 初始化一個集合
>>> s
{1, 3, 5}
>>> s.add(7)  # 向集合中添加一個不存在的元素
>>> s
{1, 3, 5, 7}
>>> s.add(5)  # 向集合中添加一個已存在的元素
>>> s
{1, 3, 5, 7}

2.remove 方法

作用:刪除集合S 中的元素
原型:S.remove(…) -> None
參數:任意不可變類型數據
返回值:當要刪除的元素存在時,返回None,否則,拋出異常

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s.remove(3)   # 元素 3 存在
>>> s             # 成功刪除
{1, 5}
>>> s.remove(3)   # 元素 3,已不存在
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 3       # 拋出異常  

3.discard 方法

作用:用於刪除集合S 中的元素,與remove 方法的不同是,如果元素不存在,不會拋出異常
原型:S.discard(…) -> None
參數:任意不可變類型數據
返回值:總是返回None

示例:

>>> s = set([1, 3, 5, 6])
>>> s.discard(3)  # 刪除一個已存在的元素
>>> s
{1, 5, 6}
>>> s.discard(7)  # 刪除一個不存在的元素
>>> s
{1, 5, 6}

4.pop 方法

作用:隨機刪除並返回集合S 中的一個元素
原型:S.pop() -> item
參數:無
返回值:被刪除的元素,如果集合爲空,拋出異常

示例:

>>> s = set([3, 5, 1])
>>> s.pop()  # 刪除並返回 1
1
>>> s.pop()  # 刪除並返回 3
3
>>> s.pop()  # 刪除並返回 5
5
>>> s        # 集合爲空
set()
>>> s.pop()  # 拋出異常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'

5.union 方法

作用:用於合併多個集合,相當於多個集合做並集運算
原型:set.union(…) -> set
參數:任意多個可迭代類型數據
返回值: 返回新的集合

示例:

>>> # 參數中有集合,元組,列表
>>> set.union({2, 3}, (3, 5), [5, 6])
{2, 3, 5, 6}

6.update 方法

作用:向集合S 中添加元素
原型:S.update(…) -> None
參數:任意多個可迭代類型數據
返回值:總是返回 None

示例:

>>> s = set({2})
>>> s
{2}
>>> s.update({3, 5}, {5, 6}, [7, 8])
>>> s
{2, 3, 5, 6, 7, 8}

7.clear 方法

作用:清空集合S
原型:S.clear() -> None
參數:無
返回值:總是返回None

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s.clear()
>>> s         # 集合爲空
set()

8.copy 方法

作用:淺拷貝集合S
原型:S.copy( ) -> set
參數:無
返回值:一個集合

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s1 = s.copy()
>>> s1
{1, 3, 5}

9.difference 方法

作用:集合的差集
原型:S.difference(…) -> set
參數:任意多個可迭代類型數據
返回值:一個集合

示例:

>>> s = set([1, 3, 5, 6])
>>> # 參數可以是任意的可迭代類型
>>> s.difference({1}, [3], (4, 5)) 
{6}

10.difference_update 方法

作用:集合的差集,與difference 方法的不同是,difference_update 直接在集合S 上做修改
原型:S.difference_update(…) -> None
參數:任意多個可迭代類型數據
返回值:總是返回None

示例:

>>> s = set([1, 3, 5, 6])
>>> s.difference_update({1}, [3], (4, 5))
>>> s
{6}

11.intersection 方法

作用:集合的交集
原型:S.intersection(…) -> set
參數:任意多個可迭代類型數據
返回值:一個集合

示例:

>>> s = set([1, 3, 5, 6])
>>> s.intersection({1}, [3], (4, 5)) # 相當於 s & {1} & [3] & (4, 5)
set()
>>> s.intersection({1, 3}, [3, 4], (3, 4, 5)) # 相當於 s & {1, 3} & [3,4] & (3, 4, 5)
{3}

12.intersection_update 方法

作用:集合的交集,與intersection 方法的不同是,intersection_update 直接在集合S 上做修改
原型:S.difference_update(…) -> None
參數:任意多個可迭代類型數據
返回值:總是返回None

示例:

>>> s = set([1, 3, 5, 6])
>>> s.intersection_update({1, 3}, [3,4], (3, 4, 5))  
>>> s
{3}

13.isdisjoint 方法

作用:用於判斷兩個集合中是否有相同的元素
原型:S.isdisjoint(…) -> bool
參數:任意可迭代類型數據
返回值:如果有相同的元素,返回False,否則,返回True

示例:

>>> s1 = set([1, 2, 3])
>>> s2 = set([3, 4, 5])
>>> s3 = set([5, 6])
>>> s1.isdisjoint(s2) # s1, s2 中有相同的元素
False
>>> s1.isdisjoint(s3) # s1, s3 中沒有相同的元素
True
>>> s1.isdisjoint((4, 5)) # 參數是元組
True

14.issubset 方法

作用:判斷集合S 是否是另一個集合的子集
原型:S.issubset(…) -> bool
參數:任意可迭代類型數據
返回值bool 類型

示例:

>>> s = set([1, 3, 5])
>>> s.issubset({1, 3, 5, 7}) # 參數是字典
True
>>> s.issubset([1, 3, 5, 7]) # 參數是數組
True
>>> s.issubset([1, 3, 7])
False

15.issuperset 方法

作用:判斷一個集合是否是另一個集合S 的子集,是issubset方法的反義
原型:S.issuperset(…) -> bool
參數:任意可迭代類型數據
返回值bool 類型

示例:

>>> s.issuperset({1, 3, 5, 7})
False
>>> s.issuperset({1, 3})
True

16.symmetric_difference 方法

作用:返回兩個集合中不重複的元素集合
原型:S.symmetric_difference(…) -> set
參數:任意可迭代類型數據
返回值:一個集合

示例:

>>> s = set([1, 3, 5])
>>> s
{1, 3, 5}
>>> s.symmetric_difference([8, 9])
{1, 3, 5, 8, 9}
>>> s.symmetric_difference([8, 3])
{8, 1, 5}

17.symmetric_difference_update 方法

作用:求兩個集合中不重複的元素集合,與symmetric_difference方法的不同是,symmetric_difference_update 方法,直接在S 修改
原型:S.symmetric_difference_update(…) -> None
參數:任意可迭代類型數據
返回值:總是返回None

示例:

>>> s = set([1, 3, 5])
>>> s.symmetric_difference_update({6, 8})
>>> s
{1, 3, 5, 6, 8}
>>> s.symmetric_difference_update({6, 8})
>>> s
{1, 3, 5}

(完。)


推薦閱讀:

Python 簡明教程 — 8,Python 字符串函數
Python 簡明教程 — 9,Python 編碼
Python 簡明教程 —10,Python 列表
Python 簡明教程 —11,Python 元組
Python 簡明教程 —12,Python 字典


歡迎關注作者公衆號,獲取更多技術乾貨。

碼農充電站pro

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章