集合
定義
- set翻譯為集合
- collection翻譯為集合類型,是一個較大的概念
- set是一個可變的、無序的、不重復的元素組成的集合
- set的元素要求必須可以hash,目前已學的不可hash的類型只有list、set
- 元素不可以索引
- set可以迭代
set的初始化
- set_1 =set() #表示定義一個空集合set_1
- set_1 =set(iterable) #講一個可迭代對象的元組添加到set_1這個集合中
set的操作
- add(elem)
增加一個元素到set中,如果元素存在則什么都不做
- update(*others)
合并其他元素到set中,參數others必須是可迭代對象;屬于就地修改
- remove(elem)
從set中移除一個元素,元素若不存在,則報keyerror
- discard(elem)
從set中移除一個元素,若不存在則什么都不做
- pop()
移除并返回任意元素。若是空set則返回keyerror
- clear()
移除所有元素,若set很大會引起GC(內存垃圾回收)
- 修改
在set中,要么刪除,要么添加,由于set是無序的,只有通過hash值來查找元素,修改就相當于先刪除再添加
- 查詢
非線性結構,無法索引;除非知道某個值確切再set中,通過hash值來查看
- 遍歷
可以迭代所有元素,
- 成員運算符
in和not in判斷元素是否再set中,由于是通過hash值來查找的,所以效率為O(1)
set和線性結構
- 線性結構的查詢時間復雜度是O(n),隨著數據規模增大而增大加耗時
- set、dict(dictionary字典)等結構,內部使用hash值作為key,時間復雜度可以做到O(1),查詢時間和數據規模無關
- 可hash
- 數值型int、float、complex - bool型True、False - 字符串string、bytes - 元組tuple - None 以上都是不可變類型,成為可hash類型(hashable)
- set的元素必須是可hash的
集合的概念
- 基本概念
- 全集
所有元素的集合。例如正整數集,所有正整數組成的集合
- 子集subset和超集superset
集合A的所有元素都在集合B中,稱A是B的子集,B是A的超集
- 真子集和真超集
A是B的子集,且A的元素比B少,則稱A是B的真子集,B是A的真超集
- 并集是多個集合合并的結果
- 交集是多個集合的公共部分
- 差集是集合中出去交集外的部分
- 集合運算
1. 并集
將兩個集合A和B的所有元素合并到一起,組成的集合叫A和B的并集
- union(*others) 返回和多個集合合并后的新的集合,例:s1.union(s2[,s3])
- '|'運算符重載 等同于union,例:s1|s2[|s3]
- update(*others) 和多個集合合并,就地修改,例:s1.update(s2[,s3])
- '|=' 等同于update,例:s1|= s2 [| s3]
2. 交集
集合A和集合B中所有同時屬于A和B的元素組成的集合叫A和b的交集
- intersection(*others) 返回多個集合的交集
- '&' 等同于intersection
- intersection_update(*others) 獲取多個集合的交集,就地修改
- '&=' 等同于intersection_update
3. 差集
集合A和B,所有屬于A切不屬于B的元素組成的的集合
- difference(*othens) 返回多個集合的差集
- '-' 等同于difference
- difference_update(*others)返回多個集合的差集并就地修改
- '-=' 等同difference_update
4. 對稱差集
集合A和B,有所欲不屬于A和B的交集元素組成的集合稱為對稱差集
- symmetric_difference(other) 返回另一個集合的差集
- '^' 等同于symmetric_difference
- symmetric_difference_update(other) 獲取和另一個集合的差集并就地修改
- '^=' 等同于symmetric_difference_update
- issubnet(other)、<=
判斷當前集合是不是另一個集合的子集
- set1 < set2
判斷set1是不是set2的真子集
- issuperset(other)、>=
判斷當前集合是不是other的超集
- set1 > set2
判斷set1是不是set2的正超集
- isdisjoint(other)
當前集合和另一個集合沒有交集返回True,有交集返回False
練習
- 隨機產生2組10個數字的列表,取值范圍[10,20]
- 統計20個數字中有多少個不同的數字
- 2組中,不重復的數字有幾個,是什么
- 兩組中重復的數字有幾個是什么
import random
fst_nums = []
sec_nums = []
for _ in range(10):
fst_nums.append(random.randint(10,20))
sec_nums.append(random.randint(10,20))
print(fst_nums,sec_nums) #created random sequence
print()
fst_nums,sec_nums = set(fst_nums),set(sec_nums)
print(fst_nums|sec_nums)
print(fst_nums ^ sec_nums)
print(fst_nums & sec_nums)
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87626