集合就是數學裏的集合,沒有什麼特殊的定義。集合最好的應用是去重。
集合的表示方法是經過一個{}建立或者經過set和frozenset函數轉換成集合。python
set() 建立可變集合對象 frozenset() 建立不可變集合對象
s = {"tom","cat","name","error"} 或 s = set({"tom","cat","name","error"})
>>> s = [23,3,4,32] >>> d = frozenset(s) //建立不可變集合d >>> print(d) >>> frozenset({23,3,4,32})
集合是一組無序排序的可哈希hash的值,不重複 支持集合關係測試: 支持成員關係測試:in , not in 支持迭代 不支持:索引、元素獲取、切片 沒有特定語法格式,只能經過工廠函數set或者frozenset建立,字符串則直接建立便可。 集合中的元素必須是可迭代對象,全部元素不會重複,不像list列表是能夠重複
注:可哈希什麼意思?
hash是一種函數映射,稱爲hash函數,y=hash_func(x),可hash就是指對於一個對象x有其對應的y。在python內部是經過字典key的hash值來對應內存中的value地址的,因此兩個相同hash的key就表示同一個了,而不可hash的對象天然也不能做爲字典的key。app
s | t s和t的並集 s & t s和t的交集 s - t 求差集 s ^ t 求對稱差集 len(s) 集合中項數 max(s) 最大值 min(s) 最小值
s.add(item) 將item添加到s中。若是item已經在s中,則無任何效果 s.remove(item) 從s中刪除item。若是item不是s的成員,則引起KeyError異常 s.discard(item) 從s中刪除item。若是item不是s的成員,則無任何效果 s.pop() 隨機刪除一個s中任意的集合元素,若是有變量接收則會接收到刪除到的那個元素 s.clear() 刪除s中的全部元素 s.copy() 淺複製 s.update(t)將t中的全部元素添加到s中。t能夠是另外一個集合、一個序列或者支持迭代的任意對象 s.union(t) 求並集。返回全部在s和t中的元素 s.intersection(t) 求交集。返回全部同時在s和t中的都有的元素 s.intersection_update(t) 計算s與t的交集,並將結果放入s s.difference(t) 求差集。返回全部在set中,但不在t中的元素 s.difference_update(t) 從s中刪除同時也在t中的全部元素 s.symmetric_difference(t) 求對稱差集。返回全部s中沒有t中的元素和t中沒有s中的元素組成的集合 s.sysmmetric_difference_update(t) 計算s與t的對稱差集,並將結果放入s s.isdisjoint(t) 若是s和t沒有相同項,則返回True s.issubset(t) 若是s是t的一個子集,則返回True s.issuperset(t) 若是s是t的一個超集,則返回True
例1:去除海量列表裏重複元素ide
>>> a = [11,22,33,44,11,22] >>> b = set(a) >>> b set([33, 11, 44, 22])
例2:去除重複元素後轉換成列表函數
l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2
還有一種聽說速度更快的,沒測試過二者的速度差異測試
l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys() print l2
這兩種都有個缺點,祛除重複元素後排序變了:
['a', 'c', 'b', 'd']code
若是想要保持他們原來的排序:對象
用list類的sort方法 l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) l2.sort(key=l1.index) print l2
也能夠這樣寫:排序
l1 = ['b','c','d','b','c','a','a'] l2 = sorted(set(l1),key=l1.index) print l2
也能夠用遍歷:索引
l1 = ['b','c','d','b','c','a','a'] l2 = [] for i in l1: if not i in l2: l2.append(i) print l2
上面的代碼也能夠這樣寫內存
l1 = ['b','c','d','b','c','a','a'] l2 = [] [l2.append(i) for i in l1 if not i in l2] print l2
這樣就能夠保證排序不變了:['b', 'c', 'd', 'a']