集合(set)與字典類似,也是由大括号{}表示,多個元素之間用逗号‘,’分隔。需要注意集合是無序且不重複的,集合中的元素必須是不可變資料(字元串,整數,元祖)。同數學中的集合一樣,集合可以執行集合的并、交、差運算。注:對于 并集, 交集, 差集 等的傳回值,與最左邊的操作數具有相同的類型。例如:s & t 取交集。s集合是一個set類型的集合,t集合是一個frozenset類型的集合,則傳回的結果将是set類型的集合。
集合有兩種不同的類型,可變集合(set)和不可變集合:①可變集合可以添加或删除元素,但可變集合所存儲的元素不能被哈希,是以不能用做字典的鍵;②不可變集合(frozenset)不能添加或删除元素,但元素是可哈希的,可以做字典的鍵
一、可變集合(set)
1、set的建立
# -*- coding:utf-8 -*-
# author: kenny
# 建立:用{}直接建立,也可以用工廠函數set()來建立
set_1 = {1, 2, 3, 4}
print(set_1) # {1, 2, 3, 4}
set_2 = set()
print(set_2) # set()
# 集合會把傳入的字元串拆分為單個字元作為集合的成員
set_3 = set("java")
print(set_3) # {'a', 'j', 'v'}
# 當傳入清單時,集合會把清單内的元素作為集合成員。
set_4 = set(['python', 'c', 'c++'])
print(set_4) # {'c', 'python', 'c++'}
# 空集合隻能使用set()函數來定義,直接使用{}定義的是空字典
s1 = set()
s2 = {}
print(type(s1)) # <class 'set'>
print(type(s2)) # <class 'dict'>
2、增加
(1)set1.add('元素')--->将元素無序的插入集合set1中
set_1 = {1, 2, 3, 4}
set_1.add('java')
print(set_1) # {1, 2, 3, 4, 'java'}
(2)set1.update("元素")--->将元素疊代的無序的加入集合set1中
set_1 = {1, 2, 3, 4}
set_1.update("java")
print(set_1) # {1, 2, 3, 4, 'j', 'a', 'v'}
3、删除
(1)set1.pop()---->随機删除,傳回值為删除掉的元素
set_1 = {1, 2, 3, 4}
s = set_1.pop()
print(set_1) # {2, 3, 4}
print(s) # 1
(2)set1.remove("元素")--->按元素删除,若無該元素則報錯
set_1 = {1, 2, 3, 4}
set_1.remove(2)
print(set_1) # {1, 3, 4}
(3)set1.discard(obj)---->如果集合記憶體在指定元素,則删除,若不存在,不做任何事
set_1 = {1, 2, 3, 4}
set_1.discard(1)
print(set_1) # {2, 3, 4}
(4)set1.clear()--->清空集合。輸出集合的時候是set(),為了與空字典{}相區分
set_1 = {1, 2, 3, 4}
set_1.clear()
print(set_1) # set()
(5)del set1------>删除整個集合
set_1 = {1, 2, 3, 4}
del set_1
print(set_1) # NameError: name 'set_1' is not defined
4、查找
因為集合是無序的,是以取某一個值,隻能用for周遊
set_1 = {1, 2, 3, 4}
for i in set_1:
print(i, end=' ') # 1 2 3 4
print(set_1(1)) # TypeError: 'set' object is not callable
我們雖然不能直接查找集合,但是我們可以用in操作符檢視集合中是否存在對象
set_1 = {1, 2, 'java'}
print('1' in set_1) # False
print(1 in set_1) # True
5、交集,并集,差集
s1 = {1, 'java', ('tuple_1', 'tuple_2', 3)}
s2 = {'do', 're', 'mi', 1, ('tuple_1', 'tuple_2', 3)}
s_jiao = s1 & s2
s_bing = s1 | s2
s_cha = s1 - s2
# 交集
print(s_jiao) # {1, ('tuple_1', 'tuple_2', 3)}
print(s1.intersection(s2)) # {1, ('tuple_1', 'tuple_2', 3)}
# 并集
print(s_bing) # {'re', 1, ('tuple_1', 'tuple_2', 3), 'java', 'mi', 'do'}
print(s1.union(s2)) # {'re', 1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 'java'}
# 差集
print(s_cha) # {'java'}
print(s1.difference(s2)) # {'java'}
# 對稱差集:去掉交集後的元素
print(s1 ^ s2) # {'re', 'do', 'mi', 'java'}
print(s1.symmetric_difference(s2)) # {'java', 'mi', 'do', 're'}
# s1與s2取交集,然後用結果更新s1
s1.intersection_update(s2)
print(s1) # {1, ('tuple_1', 'tuple_2', 3)}
print(s2) # {1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 're'}
# s1與s2取差集,然後用結果更新s1
s1.difference_update(s2)
print(s1) # {'java'}
print(s2) # {'do', 1, 'mi', ('tuple_1', 'tuple_2', 3), 're'}
# s1與s2取對稱差集,然後用結果更新s1
s1.symmetric_difference_update(s2)
print(s1) # {'mi', 'java', 'do', 're'}
print(s2) # {'mi', 1, 'do', 're', ('tuple_1', 'tuple_2', 3)}
二、不可變集合frozenset
不可變集合不可以增加删除集合中的元素,該集合中的内容是不可改變的,類似于字元串、元組。
不可變集合,除了内容不能更改外,其他功能及操作跟可變集合set一樣
# 不可變集合的建立
fset = frozenset((1,2,3,4,5))
print(fset) # frozenset({1, 2, 3, 4, 5})