- 無序
- 唯一(去重複)
- Hashable
Set 的 item 必須是 Hashable,像 dict 的 key 一樣,也就表示 set 的 item 必須是 immutable,所以不可以把 set 裝到 set 裡,目前知道 immutable 的集合物件只有 tuple 一個,很快就會出現另一個了,像 tuple 是 immutable 的 list 一樣,set 也有 immutable 的版本。
set() & {}
語法類似半套的 dict,用大括號,但只有 key,沒有 value。s = {'a', 'A', 'a'}
print(s) # {'A', 'a'}
比較常用其他 sequence 來建立 set,同時去除重複。s = 'Pineapple & Apple'
li1 = list(s)
print(len(li1)) # 17
print(li1) # ['P', 'i', 'n', 'e'...
print(sorted(li1)) # [' ', ' ', '&', 'A'...
s1 = set(s)
print(len(s1)) # 10
print(s1) # {'P', ' ', 'p', 'a', '&', 'A', 'l', 'i', 'e', 'n'}
print(sorted(s1)) # [' ', '&', 'A', 'P', 'a', 'e', 'i', 'l', 'n', 'p']
可以使用所有 sequence 和順序無關的操作,例如 len() 與 for-in,但是不能用 [N] 或者 slice。set 的 method
除了使用 set() 與 {} 建立 set 外,也可以使用 set.add() 與 set.remove() 操作 set 裡的 item。s1 = set('Apple')
print(s1) # {'p', 'A', 'l', 'e'}
s1.add('E')
print(s1) # {'E', 'p', 'e', 'l', 'A'}
s1.remove('p')
print(s1) # {'e', 'E', 'A', 'l'}
# s1.remove('X') # KeyError
s1.discard('X') # 同 remove() 但不存在不會報錯
print(s1.pop()) # e,任意丟出一個,如果 set 空了會丟出 KeyError
s1.clear() # 清空
print(s1) # set()
set item 比對
print('A' in set('Apple')) # True
print('p' not in set('Apple')) # False
print(set('Apple').isdisjoint(set('Banana'))) # True,兩個 set 沒有相同的 item,也就是交集為空
# 子集
print(set('Apple').issubset(set('Apple'))) # True,s <= other
print(set('Apple').issubset(set('PineApple'))) # True,s < =other
print(set('Apple') == set('Apple')) # True
print(set('Apple') <= set('PineApple')) # True
# 超集
print(set('PineApple').issuperset(set('Apple'))) # True,s >= other
print(set('PineApple') > set('Apple')) # True,s >= other
# 聯集
u1 = set('PineApple').union(set('Apple'))
u2 = set('PineApple') | set('Apple')
print(u1 == u2) # True
print(u1) # {'i', 'P', 'n', 'A', 'p', 'l', 'e'}
# 交集
u1 = set('PineApple').intersection(set('Apple'))
u2 = set('PineApple') & set('Apple')
print(u1 == u2) # True
print(u1) # {'p', 'e', 'l', 'A'}
# 差集
u1 = set('PineApple').difference(set('Apple'))
u2 = set('PineApple') - set('Apple')
print(u1 == u2) # True
print(u1) # {'i', 'P', 'n'}
# 對稱差集,只能一邊有,不能兩邊有,當然不會有兩邊都沒有
u1 = set('abc').symmetric_difference(set('bcd'))
u2 = set('abc') ^ set('bcd')
print(u1 == u2) # True
print(u1) # {'d', 'a'}
# 複製
s1 = set('Apple')
s2 = s1.copy()
s1.add('X')
print(s1) # {'A', 'p', 'l', 'e', 'X'}
print(s2) # {'l', 'A', 'p', 'e'}
特別的是 union()、intersection()、difference()、symmetric_difference()、issubset() 與 issuperset() 可以接受 iterable 參數,並不限制只能傳 set,但是相對應的運算子(==、>、>=、<、<=、!=、|、&、-、^、)就只能 set 對 set。還有一點特別要注意的,並沒有 set + set 運算子,兩個 set 相加只能用 | 或者 union()。
frozenset() - immutable set
唯讀的 set,上面所有唯讀的操作都可以使用,也可以用在 dict 的 key,以及 set of frozenset。
print(frozenset('Apple')) # frozenset({'l', 'p', 'e', 'A'})
官方文件。---
---
---
沒有留言:
張貼留言