基本數據類型-Set

概念和基礎

集合(set),由一個或多個確定的元素所構成的整體,是一個無序不重複元素的序列,可以使用大括號{}或者set()函數創建集合,注意:創建空集合只能使用set(),如果使用{}創建的是一個空字典,集合存在的意義就在於去重和關係運算。
創建格式:

param = {value1, value2, ...}
or
param = set(value)

快速判斷元素是否在集合內使用可以使用in,如果存在的話返回True,否則返回False

e.g.
value in param

去重演示:

>>>set_test = set('hello')
>>>set_test
{'h', 'e', 'l', 'o'}

集合中的元素有三個特徵:

  1. 確定性(必須可哈希)
  2. 互異性(去重)
  3. 無序性(集合中的元素沒有先後之分,集合{2,3,4}和集合{3,4,2}算是同一個集合)

注意:集合存在的意義就在於去重和關係運算

set在創建的時候有可變集合不可變集合兩種,可變集合set(value)或者直接{value1, value2, …},不可變集合可以通過將可變集合改爲不可變集合,

e.g. 
frozenset(set_name)

關係運算

差集

差集有差集和對稱差集之分,差集是隻在某一個集合中有,在另外一個集合中沒有,對稱差集是兩個集合各自有的元素做並集並返回。

差集

可以使用集合的difference()方法或者使用符號"-"。

e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.difference(names2))  #只在集合names1中存在的元素
{'Alex'}
>>>print(names1 - names2)  #只在集合names1中存在的元素
{'Alex'}
對稱差集

按照對對稱差集的理解,可以通過對 set1 集合求對 set2 集合的差集,再並上 set2 集合對 set1 集合的差集,如下所示:

>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>names1_names2 = names1.difference(names2)  #求對於names1對names2的差集
>>>print(names2_names2)
{'Alex'}
>>>names2_names1 = names2.difference(names1)  #求對於names2對names1的差集
>>>print(names2_names1)
{'Mark'}
>>>names1_names2 | names2_names1
{'Alex', 'Mark'}

這種方法比較繁瑣,需要對兩個集合一次求另一個集合的差集,然後再求並集,python中直接提供了方法來實現對稱差集,可以使用集合的symmetric_difference()或者使用符號"^"。

>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.symmetric_difference(names2))  #只在集合names1中存在的元素
{'Alex', 'Mark'}
>>>print(names1 ^ names2)  #只在集合names1中存在的元素
{'Alex', 'Mark'}
交集

獲取兩個集合中重複的部分並返回,可以使用集合的intersection()方法,或者使用符號"&"。

e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.intersection(names2))
{'Jack'}
>>>print(names1 & names2)
{'Jack'}
並集

獲取兩個集合中所有的元素並去重,可以使用集合的union()方法,或者使用符號"|"。

e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.union(names2))
{'Mark', 'Alex', 'Jack'}
>>>print(names1 | names2)
{'Mark', 'Alex', 'Jack'}

常用操作

元素的增加

python 中元素的增加有兩種類型,一種的單個元素的添加,一種是對序列的添加。

單個元素的添加

python 中單個元素的添加使用的是add()方法,add()的作用類似於列表中的append()方法。注意:使用該方法的時候不能添加可變數據類型,比如列表,錯誤提示:TypeError: unhashable type: ‘list’。

>>>set1 = {1, 2}
>>>set1.add(3)
{1, 2, 3}
>>>set1.add((4, 5))
{(4, 5), 1, 2, 3}
序列的添加

python中對序列的添加使用的是update()方法,update()方法的作用類似於列表中的extend()方法,序列包括但不限於列表、元組和字典,update方法支持同時傳入多個參數。

>>> set1 = {1,2}
>>> set1.update([3,4],[1,2,7])
>>> set1
{1, 2, 3, 4, 7}
>>> set1.update("hello")  #在update字符串的時候比較特殊,是將每個字符拆開添加到集合中
>>> set1
{1, 2, 3, 4, 7, 'h', 'e', 'l', 'o'}
>>> set1.update(("hello", "world"))
{1, 2, 3, 4, 7, 'l', 'h', 'world', 'o', 'e', 'hello'}
元素的刪除

集合中刪除單個元素有三種方法,discard(),remove()和pop(),三者的區別:

  • set.discard(value)可以指定元素,並且無返回值,在元素不在集合裏的時候不會拋出異常
  • set.remove(value)可以指定元素,,並且無返回值,如果元素不在集合裏,會拋出KeyError錯誤
  • set.和pop()隨機刪除一個元素,不能指定,返回刪除的元素,並且當集合爲空的時候,會拋出KeyError錯誤

清空集合的方法:clear(),就算是一個空集合,清空的話也不會報錯

>>> set1={1,2,3,4}
>>> set1.discard(1)
>>> set1
{2, 3, 4}
>>> set1.discard(1)  #元素不存在,解釋器也沒有報錯
>>> set1
{2, 3, 4}
>>> set1.remove(1)
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    set1.remove(1)
KeyError: 1
>>> set1.clear()
>>> set1
set()
>>> set1.pop()
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    set1.pop()
KeyError: 'pop from an empty set'
>>> set1.clear()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章