Python的set集合詳解


Python 還包含了一個數據類型 —— set (集合)。集合是一個無序不重復元素的集。基本功能包括關系測試和消除重復元素。集合對象還支持 union(聯合),intersection(交),difference(差)和 sysmmetric difference(對稱差集)等數學運算。

創建集合set

  大括號或 set() 函數可以用來創建集合。 

  set集合類需要的參數必須是迭代器類型的,如:序列、字典等,然后轉換成無序不重復的元素集。由於集合是不重復的,所以可以對字符串、列表、元組進行去重操作。

創建空集合

>>> s=set()
>>> s
set()
>>> s1=set([]) #列表
>>> s1
set()
>>> s2=set(()) #元組
>>> s2
set()
>>> s3=set({}) #字典
>>> s3
set()

  注意:想要創建空集合,你必須使用 set() 而不是 {}。后者用於創建空字典,我們在后面介紹的一種數據結構。

創建非空集合

 即列表,元組,字典不在是空值,舉兩個例子

>>> s1=set([1,2,3,4])
>>> s1
{1, 2, 3, 4}
  
>>> s3=set({'a':2,'b':3,'c':4})
>>> s3
{'c', 'a', 'b'}

  注:字典轉set集合,需要注意的是,只取了字典的key,相當於將字典中的dict.keys()列表轉成set集合。

集合的操作

集合添加

  集合的添加有兩種方式,分別是add和update。但是它們在添加元素時是由區別的:

  • add()方法
    把要傳入的元素作為一個整體添加到集合中,如:
>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> s.add('two')
>>> s
{'e', 'two', 'o', 'n'}
  • update()方法
    是把要傳入的元素拆分成單個字符,存於集合中,並去掉重復的字符。可以一次添加多個值,如:
>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> s.update('two')
>>> s
{'e', 'n', 't', 'w', 'o'}

集合刪除

  集合的刪除操作使用的方法跟列表是一樣的,使用的也是remove方法。如:

  • setVar.remove(element)
    setVar :為一個set類型的變量
    element :表示要查找並刪除的元素
    函數作用:
    在集合setVar中查找element元素,如果存在則刪除;如果沒找到,則報錯。
>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> s.remove('e')
>>> s
{'n', 'o'}
  • setVar.discard(element)
    setVar :為一個set類型的變量
    element :表示要查找並刪除的元素
    函數作用:
    在集合setVar中查找element元素,如果存在則刪除;如果沒找到,則什么也不做。
>>> sList
set([1, 2, 3, 4, 5])
>>> sList.discard(1)
>>> sList
set([2, 3, 4, 5])
  • s.pop()
    s:為set類型的變量
    函數作用:
    刪除並返回set類型的s中的一個不確定的元素,如果為空引發KeyError錯誤。
>>> sList
set([2, 3, 4, 5])
>>> sList.pop()
2
  • s.clear()
    s:set類型的變量
    函數作用:
    清空s集合中的所有元素
>>> sList
set([3, 4, 5])
>>> sList.clear()
>>> sList
set([])

集合的遍歷

集合的遍歷跟序列的遍歷方法完全一樣。

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> for i in s:
	print(i)
... ... 
e
o
n
>>> 

另一種遍歷方式:

>>> s=set('one')
>>> s
{'e', 'o', 'n'}
>>> for idex,i in enumerate(s):
		print (idex,i)
... ... 
0 e
1 o
2 n
>>> 

  變量idex表示集合中元素i的索引。

集合其他方法

函數 說明
len(s) set 的長度
x in s 測試 x 是否是 s 的成員
x not in s 測試 x 是否不是 s 的成員
s.issubset(t) 測試是否 s 中的每一個元素都在 t 中
s.issuperset(t) 測試是否 t 中的每一個元素都在 s 中
s.union(t) 返回一個新的 set 包含 s 和 t 中的每一個元素
s.intersection(t) 返回一個新的 set 包含 s 和 t 中的公共元素
s.difference(t) 返回一個新的 set 包含 s 中有但是 t 中沒有的元素
s.symmetric_difference(t) 返回一個新的 set 包含 s 和 t 中不重復的元素
s.copy() 返回 set “s”的一個淺復制

集合的一些操作符

  既然是集合,那就會遵循集合的一些操作方法,如求交集、並集、差集等。

交集

  Python中求集合的交集使用的符號是“&”,返回連個集合的共同元素的集合,即集合的交集。

>>> st1 = set('python')
>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st2 = set('htc')
>>> st2
set(['h', 'c', 't'])
>>> st1 & st2
set(['h', 't'])

並集(合集)

  Python中求集合的並集用的是符號“|”,返回的是兩個集合所有的並去掉重復的元素的集合。

>>> st1
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> st3 = set('two')
>>> st3
set(['o', 't', 'w'])
>>> st1 | st3
set(['p', 't', 'w', 'y', 'h', 'o', 'n'])

差集

  Python中差集使用的符號是減號“-”。

>>> st1
set(['1', '3', '2', '5', '4', '7', '6'])
>>> st2 = set('4589')
>>> st2
set(['9', '8', '5', '4'])
>>> st1 - st2
set(['1', '3', '2', '7', '6'])

  返回的結果是在集合st1中但不在集合st2中的元素的集合。

集合的不同

  查看兩個集合的不同之處,使用的difference函數,等價於差集。如:
  **s1.difference(s3) **
  這種不同指的是集合s3相對於集合s1,不同的地方,也就是所有在集合s1中,而不再集合s2中的的元素組成的新集合。

>>> s1
set([1, 2, 3, 4, 5])
>>> s2
set([1, 2, 3, 4])
>>> s1.difference(s2)
set([5])
>>> s3
set(['1', '8', '9', '5'])
>>> s1.difference(s3)
set([1, 2, 3, 4, 5])

集合的范圍判斷

  集合可以使用大於(>)、小於(<)、大於等於(>=)、小於等於(<=)、等於(==)、不等於(!=)來判斷某個集合是否完全包含於另一個集合,也可以使用子父集判斷函數。

 定義三個集合s1,s2,s3:

>>> s1=set([1, 2, 3, 4, 5])
>>> s2=set([1, 2, 3, 4])
>>> s3=set(['1', '8', '9', '5'])

大於(>)或大於等於(>=)

>>> s1 > s2
True
>>> s1 > s3
False
>>> s1 >= s2
True

  表示左邊集合是否完全包含右邊集合,如集合s1是否完全包含集合s2。

小於(<)或 小於等於(<=)

>>> s2 < s1
True
>>> s1 < s3
False
>>> s3 < s1
False

  表示左邊的集合是否完全包含於右邊的集合,如集合s1是否完全包含於集合s2。

等於(==)、不等於(!=)

>>> s1 == s2
False
>>> s2 == s3
False
>>> s1 != s2
True

  判斷兩個集合是否完全相同。

不可變集合frozenset

  Python中還有一種不可改變的集合,那就是frozenset,不像set集合,可以增加刪除集合中的元素,該集合中的內容是不可改變的,類似於字符串、元組。

>>> f = frozenset()
>>> f
frozenset([])
>>> f = frozenset('asdf')
>>> f
frozenset(['a', 's', 'd', 'f'])
>>> f = frozenset([1,2,3,4])
>>> f
frozenset([1, 2, 3, 4])
>>> f = frozenset((1,2,3,4))
>>> f
frozenset([1, 2, 3, 4])
>>> f = frozenset({1:2, 'a':2, 'c':3})
>>> f
frozenset(['a', 1, 'c'])

  如果試圖改變不可變集合中的元素,就會報AttributeError錯誤。
  不可變集合,除了內容不能更改外,其他功能及操作跟可變集合set一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM