Python內置數據結構 - 集合set

集合的定義

  • 集合是高中數學中的一個概念
  • 一堆確定的無序的唯一的數據,每個數據稱爲元素
  • 無法使用索引和分片(因爲無序)
  • 數據具有唯一性,可以用來排重(排除重複數據)
  • 集合內部數據只能放置可哈希的數據,比如:str, int, float, tuple, 冰凍集合(frozen set) 等。
  • 無法用大括號定義一個空集合

集合的操作

  • 成員檢測: in, not in
# 成員檢測
# in, not in 

s = {3,54,"i", "love", "you"}
# 可以看到集合是無序的,print打出的不一定是你輸入的順序
print(s)

if "love" in s:
    print("愛")

if "haha" not in s:
    print("not found")
  • for 循環
# for循環
s = {3,54,"i", "love", "you"}
for i in s:
    print(i, end = " ")

# 帶有元組的集合的遍歷
# 如果元組的個數一致
s = {(1,2,3),('a','b','c'),("I","love", "you")}

for k,l,m in s:
    print(k,"--",l,"--",m)
for k in s:
    print(k)
  • 集合的內涵
# 普通的集合內涵
# 以下集合在初始化後自動過濾掉重複元素
s = {2,3,3,4,23,234,34,2,33,3,3,33,3,33,1,2,33,4}
print(s)

# 帶條件的集合內涵
s = {2,3,3,4,23,234,34,2,33,3,3,33,3,33,1,2,33,4}
# 返回s中的偶數的集合
ss = {i for i in s if i % 2 == 0}
print(s)
print(ss)

# 多循環的集合內涵

s1 = {1,2,3,4}
s2 = {"i", "love","wangwang"}

# 以下語句類似兩個for循環
# for m in s1:
#    for n in s2:
#        把m*n添加到s的集合中
s = {m*n for m in s1 for n in s2}
print(s)

# 有條件的多循環的集合內涵,只能一行判斷條件
# 以下語句類似兩個for循環
# for m in s1:
#    for n in s2:
#        if n ==2:
#            把m*n添加到s的集合中
print("*" * 20)
s = {m*n for m in s1 for n in s2 if m ==2}
print(s)

集合內部函數

  • add:向集合中添加數據add, 注意集合裏沒有順序,所以沒有append和insert方法
  • clear:原地清空
  • copy:複製並生成新的集合
  • remove: 移除指定的值,如果刪除的值不存在,報錯
  • discard:移除集合中指定的值,如果指定的值不存在,不報錯
  • pop: 移除一個元素,是按哈希序列順序從左移除
#add: 向集合裏添加數據,注意集合裏沒有順序,所以沒有append和insert方法
s = {1}
s.add(333)
print(s)

# copy 拷貝
# clear 原地清空
s = {1,2,3,4}
print(id(s))
s.clear()

print(id(s))
print(s)

# discard:移除集合中指定的值,如果指定的值不存在,不報錯
s = {2,3,4,6,8,3}
s.discard(2)
print(s)

print("*" * 30)
s.discard(100)
print(s)

# remove:移除指定的值,如果刪除的值不存在,報錯
# s.remove(100)   #這裏會報錯
print(s)
# pop:按哈希序列從左邊移除一個元素
s = {'a','b','c',1,2,3,4,5,6}
print(s)

s.pop()
print(s)
s.pop()
print(s)
s.pop()
print(s)

print("*" * 20)
s = {('a','b'),('c','d'),('e','f')}
print(s)

s.pop()
print(s)
s.pop()
print(s)
s.pop()
print(s)

運行結果:
{1, 333}
77023944
77023944
set()
{3, 4, 6, 8}


{3, 4, 6, 8}
{3, 4, 6, 8}
{1, 2, 3, ‘b’, 4, 5, ‘c’, 6, ‘a’}
{2, 3, ‘b’, 4, 5, ‘c’, 6, ‘a’}
{3, ‘b’, 4, 5, ‘c’, 6, ‘a’}
{‘b’, 4, 5, ‘c’, 6, ‘a’}


{‘bbbb’, ‘cccc’, ‘dddd’, ‘aaa’}
{‘cccc’, ‘dddd’, ‘aaa’}
{‘dddd’, ‘aaa’}
{‘aaa’}
{(‘c’, ‘d’), (‘a’, ‘b’), (‘e’, ‘f’)}
{(‘a’, ‘b’), (‘e’, ‘f’)}
{(‘e’, ‘f’)}
set()

兩個集合的數學操作

  • 集合不支持 + -
  • intersection: 交集
  • difference: 差集
  • unionn: 並集
  • issubset:檢查一個集合是否另外一個集合的子集
  • issuperset: 檢查一個集合是否是另外一個集合的超集
# 倆個集合操作的函數
s1 = {1,2,3,4,5,6}
s2 = {5,6,7,8,9}

# intersection: 交集
#s1和s2的公共部分
print(s1.intersection(s2))
print(s2.intersection(s1))

# difference: 差集
#s1中去掉s2的元素,剩下的集合
print(s1.difference(s2))
#s2中去掉s1中的元素,剩下的集合
print(s2.difference(s1))

# unionn: 並集, 兩個集合元素之和,注意去重
print(s1.union(s2))


# issubset:檢查一個集合是否另外一個集合的子集
print(s1.issubset(s2))

# 一個集合a是另外一個集合b的子集, 說明a中的元素同時也是b中的元素,issubset,簡稱a是b的子集,同時b是a的超集
print("*" * 20)
s3 = {2,3}
print(s3.issubset(s1))
print(s1.issuperset(s3))

輸出結果:
{5, 6}
{5, 6}
{1, 2, 3, 4}
{8, 9, 7}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
False


True
True

冰凍集合(frozen set)

  • 不可以修改元素的集合
  • 集合list和冰凍集合(frozen set) 的關係類似於列表list和元組tuple的關係
# 創建冰凍集合
s = frozenset()
print(type(s))

s1 = {1,2,3,4,5,6}
s2 = frozenset(s1)
print(type(s2))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章