CrazyWing:Python自動化運維開發實戰 12、Python數據類型之集合

導語:

集合就是數學裏的集合,沒有什麼特殊的定義。集合最好的應用是去重。
集合的表示方法是經過一個{}建立或者經過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)   最小值

適用於set可變集合經常使用方法:

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']

相關文章
相關標籤/搜索