簡介
set :set對象是由hashable 對象所組成的無序集合,set對象的每個元素要求可進行哈希運算,set 會對內部元素進行去重,每一個元素在同一個set 中只會出現一次,因爲set對象可變性,因此set 對象自身不可哈希。
frozenset : frozenset 對象能夠當作一個不可變set對象,是一個可哈希對象,能夠最爲frozenset、set 的元素或 dict 的 key 。
建立set對象
可哈希對象:在python常見的數據類型中,數值類型,字符串,元組,frozenset,bytes等屬於可哈希對象。 python
# 直接建立 s1 = {1, 2, (1, 4), 'b', 0x23, "\x61"} # 內部元素爲可哈希對象 s2 = set() # 空set,不可以使用s = { } # set( iter ) # 可迭代對象 s3 = set(range(5))
集合經常使用方法
frozenset的建立方法和set相同, 其餘 共同的方法以下算法
# 向集合增長一個元素 s1 = set(range(5)) s1.add(6) s1.add(4) # 當元素在set中已經存在,添加後set會自動對其去重 # 集合中刪除元素 s1.remove(6) # 從集合中移除元素 6。若是 6 不存在於集合中則會引起KeyError。 s1.discard(4) # 若是元素 4 存在於集合中則將其移除,無返回值 s1.pop() # 從集合中移除並返回任意一個元素。若是集合爲空則會引起KeyError。 s1.clear() # 從集合中移除全部元素
集合運算app
- isdisjoint(other)
若是集合中沒有與 other 共有的元素則返回 True。當且僅當兩個集合的交集爲空集合時,二者爲不相交集合。- issubset(other)
set <= other
檢測是否集合中的每一個元素都在 other 之中。
set < other
檢測集合是否爲 other 的真子集,即 set <= other and set != other。- issuperset(other)
set >= other
檢測是否 other 中的每一個元素都在集合之中。
set > other
檢測集合是否爲 other 的真超集,即 set >= other and set != other。- union(*others)
set | other | ...
返回一個新集合,其中包含來自原集合以及 others 指定的全部集合中的元素。- intersection(*others)
set & other & ...
返回一個新集合,其中包含原集合以及 others 指定的全部集合中共有的元素。- difference(*others)
set - other - ...
返回一個新集合,其中包含原集合中在 others 指定的其餘集合中不存在的元素。- symmetric_difference(other)
set ^ other
返回一個新集合,其中的元素或屬於原集合或屬於 other 指定的其餘集合,但不能同時屬於二者。- copy()
返回原集合的淺拷貝。
可使用set運算直接進行運算,運算方式和數學中集合運算方式相同,例如:ide
s1 = set(range(10)) s2 = set(range(5,15)) # s1 ==> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} # s2 ==> {5, 6, 7, 8, 9, 10, 11, 12, 13, 14} # 交集 s3 = s1 & s2 # {5, 6, 7, 8, 9} # 並集 s3 = s1 | s2 # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} # 差集:從s1 中減去s2 中存在的元素 s5 = s1 - s2 # {10, 11, 12, 13, 14} # 子集: {1,2,4} <= {1,2,3,4} # True # 對稱差集: 返回兩個集合中不一樣的元素 s6 = s1 ^ s2 # {0, 1, 2, 3, 4, 10, 11, 12, 13, 14}
frozenset 和 set 對象的比較是基於內部元素的比較,兩個對象之間仍能夠進行以上運算,可是運算結果是一個frozenset 對象,而不是set對象;code
字典能夠將一個可哈希值映射到一個任意對象,能夠經過映射關係快速查找對應數據;因此在dict中的每一項由一個key-value對組成(也稱pairs) ,其中key 會做爲字典快速查找的的一個關鍵數據,因此要求一個字典中鍵必須是惟一,並可哈希,若在賦值過程當中出現相同的key值,後者將會覆蓋以前的內容。
建立dict對象對象
# key = value 鍵值對方式 d1 = dict( a=1,b=2,c=3 ) # {'a':1, 'b':2, 'c':3} # mapping 對象建立 d2 = dict(d1, d =4 ) # {'a':1, 'b':2, 'c':3, 'd':4} # iterable對象,對象中每個元素必須有兩個值分別做爲key 和 value d3 = dicrt([(1,2),(3,4),(5,6)]) # {1:2, 3:4, 5:6}
字典中方法rem
__massing__()
方法,d[key]將會以__missing__()
的return值做爲d[key] 的內容# 該類實現了collections.defaultdict() 類相同的方法 class MyDict(dict): def __init__(self, seq=list): super().__init__ self.seq = seq def __missing__(self, key): return self.setdefault(key,self.seq()) mydic = MyDict(set) for i in "abc": mydic[i].add(1) mydic["c"] # {1} mydic # {'a': {1}, 'b': {1}, 'c': {1}}
# 批量造 key, 用列表,字符串, # .fromkeys(iter, value) d8 = dict.fromkeys(range(4), 100) d8 # {0: 100, 1: 100, 2: 100, 3: 100}
d = {'a':1, 'b':2, 'c':3, 'd':4} d["k"] # 找不到"k",將會報錯 d.get("k", -1) # .get(key, default) # 找不到會返回設定的默認值-1 d.setdefault("k", 10) # 若"k" 存在,返回k的值,若不存在"k"不存在將會執行賦值操做d["k"] = 10,並返回 10
d = {'a':1, 'b':2, 'c':3, 'd':4} d.setdefault("k",100) # setdefault(k, default=None) d # {'a':1, 'b':2, 'c':3, 'd':4,'k':100}
update([other]):使用來自 other 的鍵/值對更新字典,覆蓋原有的鍵。返回 None。文檔
d = {'a':1, 'b':2, 'c':3, 'd':4} for key in d.keys(): d.pop(key) # 改變字典長度,將會報錯 # 解決方案 d = {'a':1, 'b':2, 'c':3, 'd':4} for key in list(d.keys()): # 此時將dict視圖對象提早遍歷生成列表,再對列表進行遍歷,不是對視圖對象的遍歷,將不會報錯 d.pop(key)