1. 程式人生 > >Python學習---Python下[set集合]的學習

Python學習---Python下[set集合]的學習

inline order ima 操作符 序列 由於 聯合 hash 除了

Set集合[可變]是一個無序的,不重復的數據組合,它的主要作用如下:

1. 去重,把一個列表變成集合,就自動去重了

2. 關系測試,測試兩組數據之前的交集、差集、並集等關系

集合(set):把不同的元素組成一起形成集合,是python基本的數據類型。

集合分類:可變集合、不可變集合

可變集合(set):可添加和刪除元素,非可哈希的[但是要求自己的元素是可Hash的],不能用作字典的鍵,也不能做其他集合的元素

不可變集合(frozenset):與上面恰恰相反

創建結合:

利用set()/ frozenset()創建,且元素必須是不可變的,利用大括號{}輸出包裝

# 錯誤的創建
s = set(‘a‘, 1, ‘b‘)
print(s)          # TypeError: set expected at most 1 arguments, got 3 

li = [1, 2, ‘a‘, ‘b‘]
s = set(li)       # 列表變為集合
print(s)  # {1, 2, ‘a‘, ‘b‘}

li2 = [1, 2, 1, ‘a‘, ‘a‘]
s = set(li2)
print(s)          # 去重後: {1, 2, ‘a‘}

li = [[1, 2,], ‘a‘, ‘b‘]
s = set(li)   # 報錯,TypeError: unhashable type: ‘list‘

# set
s1 = set(‘hello‘)
print(s1)         # {‘h‘, ‘l‘, ‘o‘, ‘e‘}
# frozenset
s2 = frozenset(‘hhh‘)
print(s2)         # frozenset({‘h‘})

訪問集合

由於集合本身是無序的,所以不能為集合創建索引或切片操作,只能循環遍歷或使用in、not in來訪問或判斷集合元素。

s1 = set(‘hello world‘)
print(‘a‘ in s1)       # True
print(‘b‘ in s1)       # False
# s1[1]  #TypeError: ‘set‘ object does not support indexing
# 循環叠代無序輸出
for i in s1:
    print(i, end=‘\t‘)   # e w o r d l h	
# 直接輸出
print(s1)    # {‘h‘, ‘w‘, ‘r‘, ‘l‘, ‘o‘, ‘d‘, ‘e‘, ‘ ‘} 輸入裏面有空格,輸出也有空格

更新集合

s.add() :元素作為一個整體添加進去
s.update(): 必須添加的是一個序列,列表[可以理解為添加,但是是一個字符一個字符序列化的添加]
s.remove():刪除掉某一個元素
s.pop():刪除任何一個元素,因為set集合是無序的,刪除的隨機性
s.clear(): 清空set裏面的值
del set(): 刪除set集合

s1 = set(‘apple‘)
print("原始set集合  :", s1)
s1.add(‘samsung‘)
print("add後的set   : ", s1)
s1.update(‘huawei‘)
print("update後的set:", s1)
s1.remove(‘a‘)           # 因為添加的是序列後的單個字符,所以不能直接輸入
print("remove後的set:", s1)
s1.pop()
print("pop後的set   :", s1)
s1.clear()
print("clear後的set :", s1)
del s1
# print("del後的set   :", s1)  # 報錯 NameError: name ‘s1‘ is not defined

技術分享圖片

集合類型操作符

1 in ,not in
2 集合等價與不等價(==, !=)
3 子集、超集

4 聯合(|)操作與集合的or操作其實等價的,聯合符號有個等價的方法,union()

子集和超集: 父集必須多於子集和一個字符

S1是S0的父集合: s1.issuperset(s0) ==> s1 > s0

S0是S1的子集合: s0.issubset(s1) ==> s0 < s1

s1 = set(‘applesamsung‘)
s0 = set(‘apple‘)
print("原始set集合[s0]   :", s0)
print("原始set集合[s1]   :", s1)
print(‘s1是s0的父集合    :‘, s1 > s0)   # 父集必須多於子集和一個字符
print(‘s1是s0的issuperset:‘, s1.issuperset(s0))   # 父集必須多於子集和一個字符
print(‘s0是s1的父集合    :‘, s0 < s1)   # 父集必須多於子集和一個字符
print(‘s0是s1的issubset  :‘, s0.issubset(s1))   # 父集必須多於子集和一個字符

技術分享圖片

交集: s0.intersection(s1) ==> s0 & s1

並集: s0.union(s1) ==> s0 | s1

差集: s0.difference(s1) ==> s0 - s1 【以S0為基礎進行對比,in s0 not in s1】

對稱差集: s0.symmetric_difference(s1) ==> s0 ^ s1

s0 = set([1, 2, 3, 4, 5])
s1 = set([4, 5, 6, 7, 8])
print("原始set:s0:", s0)
print("原始set:s1:", s1)
print("【交集】and  :", s0.intersection(s1))  # 取出交集
print("【交集】s0&s1:", s0&s1)  # 取出交集
print("【並集】     :", s0.union(s1))         # 取出並集
print("【並集】s0|s1:",s0 | s1)             # 取出並集
print("【S0差集】   :", s0.difference(s1))    # 以S0為主, in S0 not in S1
print("【差集】s0-s1:", s0-s1)    # 以S0為主, in S0 not in S1
print("【S1差集】   :", s1.difference(s0))    # 以S1為主, in S1 not in S0
print("【差集】s1-s0:", s1-s0)    # 以S0為主, in S0 not in S1
print("【對稱差集】      :", s1.symmetric_difference(s0))  # 除了公共的元素以外的元素
print("【對稱差集】s0 ^s1:", s1 ^ s0 )  # 除了公共的元素以外的元素

技術分享圖片

set集合應用:最簡單的去重

‘‘‘最簡單的去重方式‘‘‘
lis = [1,2,3,4,1,2,3,4]
print list(set(lis))    #[1, 2, 3, 4]

 

Python學習---Python下[set集合]的學習