python 數據結構 set 用法
集合(set)是一個無序的不重複元素序列。
A set object is an unordered collection of distinct hashable objects.
set 是一個無序的,不重複的可hash 對象.
用來 存儲 不重複元素的一個容器,並且元素直接是無序的.
可以使用大括號 { } 或者 set() 函數創建集合.
注意:創建一個空集合必須用 set() 而不是 { },因爲 { } 是用來創建一個空字典。
# 創建一個set
s = set([3,5,9,10])
s
{9, 10, 3, 5}
t = set("Hello") #創建一個唯一字符的集合
t
{'H', 'o', 'e', 'l'}
# 也可以這樣創建一個集合
# s = {3,5,9,10}
#創建一個空集合
s = set()
# 添加元素
#如果 已經存在的元素,不會重新添加
s = {3,5,9,10}
s.add(5)
s
{9, 10, 3, 5}
s.add(66)
s
{66, 3, 5, 9, 10}
#判斷一個元素是否在 集合可以用 in
5 in s
True
6 in s
False
66 in s
True
# 求集合長度
len(s)
5
# 刪除元素集合中的一個元素
>>> s.remove(66)
>>> s
{3, 5, 9, 10}
# remove 刪除一個不存在的元素 會報錯 KeyError
s.remove('frank')
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 'frank'
# 也可以用來刪除 元素, 如果不存在不會報錯, 不會對集合做任何操作直接返回None.
# Remove an element from a set if it is a member.
# If the element is not a member, do nothing.
>>> s
{3, 5, 9, 10}
>>> s.discard('frank')
>>> s
{3, 5, 9, 10}
# 集合的拷貝 s.copy 這是一個淺拷貝
>>> s = set()
>>> s.add(1)
>>> s.add(10)
>>> s.add(5)
>>> s
{1, 10, 5}
>>> s.add(7)
>>> s
{1, 10, 5, 7}
>>> s.copy()
{1, 10, 5, 7}
>>> s2 = s.copy()
>>> s2
{1, 10, 5, 7}
#集合運算裏面 有交 並 補 差集 運算
>>> s={1,2,3,4}
>>> s2 = {3,4,5,6,7}
>>> s,s2
({1, 2, 3, 4}, {3, 4, 5, 6, 7})
>>> s
{1, 2, 3, 4}
>>> s2
{3, 4, 5, 6, 7}
>>> s& s2
{3, 4}
>>> s.intersection(s2) # 交集
{3, 4}
>>> s
{1, 2, 3, 4}
>>> s
{1, 2, 3, 4}
>>> s2
{3, 4, 5, 6, 7}
>>> s.difference(s2) # 差集
{1, 2}
>>> s - s2
{1, 2}
# 集合的並集
>>> s.union(s2)
{1, 2, 3, 4, 5, 6, 7}
>>> s|s2
{1, 2, 3, 4, 5, 6, 7}
集合的交集 和差集 運算
交集 s & s2 或 s.intersection(s2) 交集運算
差集 s - s2 或 s.difference(s2) 差集運算
並集 s |s2 或 s.union(s2) 並集運算
>>> s
{1, 2, 3, 4}
>>> s2
{3, 4, 5, 6, 7}
>>> s.symmetric_difference(s2)
{1, 2, 5, 6, 7}
>>> s^s2
{1, 2, 5, 6, 7}
刪除 兩個集合相同的元素,其他的元素構成一個集合返回. 比如上面的例子, 3,4 是公共元素,去掉兩個集合的公共元素,其他的元素構成一個新的集合返回. {1,2,5,6,7}
s^s2 或 s.symmetric_difference(s2)
判斷集合之間的關係
s.issubset(other) 判斷 自己是不是 other 的子集.即判斷 s <= other 返回 True or False
s.issuperset(other) 判斷 s >= other 返回 True or False
issubset(other)
set <= other
Test whether every element in the set is in other.
# 這個方法是判斷 自己是不是 另一個集合的子集
issuperset(other)
Report whether this set contains another set.
# 這個方法 判斷 自己 是否包含另一個集合.
>>> s
{1, 2, 3, 4}
>>> s2
{1, 2, 3, 4, 5, 6}
>>>
>>> s.issubset(s2)
True
>>> s2.issuperset(s)
True
set裏面 還有很多 xxxxx_update 方法
這裏 的作用 把更新的結果 直接寫回到原集合裏面.就相當於原地修改集合
s.difference_update(other) # 求差集把結果更新到 s 集合裏面
s.intersection_update(other) # 求交集把結果更新到 s 集合裏面
s.symmetric_difference_update(other) # 求 這個運算的結果 把結果寫到s裏面.
下面 舉個例子:
# 差集更新
s = {1, 2, 3, 4}
s2 = {3, 4, 5, 6, 7}
s - s2
{1, 2}
s.difference(s2)
{1, 2}
s
{1, 2, 3, 4}
s2
{3, 4, 5, 6, 7}
s.difference_update(s2)
# 交集更新
s = {1, 2, 3, 4}
s2 = {3, 4, 5, 6, 7}
s.intersection(s2)
{3, 4}
s.intersection_update(s2)
s
{3, 4}
# symmetric_difference_update 我也不知道叫什麼運算,暫且叫異或運算吧, 把結果更新到 s 裏面.
s
{1, 2, 3, 4}
s2
{3, 4, 5, 6, 7}
s.symmetric_difference(s2)
{1, 2, 5, 6, 7}
s.symmetric_difference_update(s2)
s
{1, 2, 5, 6, 7}
# s.update(other)
# update 方法, 將一個其他的集合 更新到自己的集合裏面. 相當於批量add 操作
# 如果有相同的元素, 也只會有一個更新的到集合裏面. 不會報錯. (集合本身是不重複的特性)
>>> s
{1, 2, 7}
>>> s2 = {11,22,33}
>>> s.update(s2)
>>> s
{1, 2, 33, 22, 7, 11}
>>> s2
{33, 11, 22}
方法 pop()
s.pop () 隨機 刪除 集合中的元素 ,並且返回該元素 , 如果集合是空的,會拋異常KeyError
>>> s = {1,34,56,32,11,35,67,89,56}
>>> s
{32, 1, 34, 35, 67, 11, 56, 89}
>>> s.pop()
32
>>> s.pop()
1
>>> s.pop()
34
>>> s.pop()
35
>>> s.pop()
67
>>> s.pop()
11
>>> s.pop()
56
# 清空集合
# s.clear() 清空集合,使其變成一個空集合.
s = {1,34,56,32,11,35,67,89,56}
s.clear()
s
set()
總結
集合一般可以用來去重操作, 當需要存放不同的元素的時候,可以考慮用set來保存元素.
參考文檔
set集合 https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset