概念和基礎
集合(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'}
集合中的元素有三個特徵:
- 確定性(必須可哈希)
- 互異性(去重)
- 無序性(集合中的元素沒有先後之分,集合{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()