Python中的字典和集合
阿新 • • 發佈:2019-01-05
1. 字典(dict
)
字典(dict
,全稱: dictionary
)是python
內建的一種使用“鍵值對結構”儲存資料的儲存模型。在其它語言中也稱為map
或者是object
(物件)
1.1 字典的操作
-
建立/查詢/修改字典
# 建立字典:變數名 = {鍵1:值1,鍵2:值2,……} d = {'kendny': 99, 'Mary': 88} # 新增資料:變數名[鍵] = 值 (字典中沒有對應的鍵) d['Tom'] = 87 # 獲取資料: 變數名[鍵] d['kendny'] # 或 d.kendny # 修改資料:變數名[鍵] = 值 (字典中存在對應的鍵)
-
常見操作字典的函式
函式 | 說明 | 例項 |
---|---|---|
len(d) |
獲取字典d中元素的長度 | len(d) |
d.setdefault(key, value) |
向字典中新增新的鍵值對, 如果存在對應的鍵, 則忽略該操作; 返回新增成功鍵值對的值。 | `d.setdefault(‘f’, 33)`` |
d1.update(d2) |
使用新字典中的資料對原始字典資料進行更新 | dict1 = {"name":"itcast","age":11} dict2 = {"address":"北京","age":22} dict1.update(dict2) |
d.pop(key) |
從字典中刪除指定鍵key對應的鍵值對, 如果鍵key 不存在將報錯; 返回值:被刪除的值value |
d.pop(‘Mary’) |
popitem() |
從字典中刪除字典最後一個鍵值對; 返回值: 被刪除的鍵值對, 以元組的形式返回 | d.popitem() |
d.get(key) |
從字典中獲取鍵為key 的值, 如果key 不存在, 則什麼都不返回,也不報錯 |
d.get(key) |
d.keys() |
以列表的形式返回字典中所有的鍵名 | d.keys() |
d.values() |
以列表的形式返回字典中所有的鍵值 | d.value() |
d.items() |
將字典中的每一項鍵值對轉化成元組, 並以列表的方式返回 | d.items() |
d.clear() |
清除字典中的元素 | d.clear() |
1.2 字典的特點
- 字典不具備索引的概念,但可以通過字典的鍵
key
操作字典中儲存的資料值value
- 字典(
dict
)內部存放的順序和鍵key放入的順序是沒有關係的。
- 字典可以根據鍵(
key
)進行資料的新增、刪除、修改、查詢等操作 - 字典通過鍵(
key
)計算位置的演算法稱為雜湊演算法(Hash) - 要保證
hash
的正確性, 作為key的物件就不能變。 在Python
中, 字串、整數等不可變型別的資料可作為 字典的鍵 - 字典的key是唯一的且必須是不可變的型別(物件), 如純元素可以作為字典的key
*為什麼字典dict
*查詢速度這麼快?
因為dict
的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中查詢元素的方法,list越大,查詢越慢。
第二種方法是先在字典的索引表裡(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種查詢速度都非常快,不會隨著字典大小的增加而變慢。
總結: 字典的查詢方式就是第二種, 字典在內部可以直接通過鍵
key
直接計算出對應的存放值的記憶體地址, 直接取出來, 所以速度非常快。
2 集合(set)
集合(set)是python
內建的一種儲存無序不重複資料的資料儲存模型
2. 1 集合的操作
-
建立集合
s = {1, 2, 3} # 建立集合
集合是無序不重複資料的資料儲存模型,它沒有索引的概念,集合中的資料可以進行新增、刪除等操作;
-
常見集合的函式
函式 說明 例項 len(s)
獲取集合中元素的個數 len(s)
s.add(data)
向集合s中新增資料data s.add(4)
s.remove(data)
從集合中刪除指定的資料, 如果資料不存在將報錯 s.remove(2)
s.discard(data)
刪除集合中的data元素, 若data不存在,什麼都不做 s.remove(22)
s.pop()
從集合中刪除字典的第一個元素並返回(不需要引數) s.pop()
s.clear()
清空集合中的資料 s.clear()
s.copy()
複製集合 ns=s.copy()
s1.difference(s2)
計算2個集合的差集(在s1中, 但不在s2中) s1.union(s2)
計算2個集合的並集`` s1.intersection(s2)
計算2個集合的交集 -
集合中的其它操作
s = {1, 2, 3} >>> 2 in s #True 集合的成員檢測 >>> {'*' + i '*' for i in s} # 集合推導式 >>> {i for i in s if i>1} # 帶有條件的集合推導式 # 多迴圈集合推導式 >>>colors = {'red','blue','pink'} >>>sizes = {36,37,38,39} >>>result = {c + str(s) for c in colors for s in sizes} print(result) #difference() 計算2個集合的差集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.difference(girls)# result = a + b print(result) #difference_update() 計算2個集合的差集(差集更新操作) dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.difference_update(girls)#a = a + b a += b print(dreamers) #union() 並集操作 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.union(girls) print(result) #update() 並集更新操作 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.update(girls) print(dreamers) #intersection() 計算2個集合的交集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.intersection(girls) print(result) #intersection_update 交集更新操作 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.intersection_update(girls) print(dreamers) #超集和子集 boys = {'zzy','yqw','dw','wzc','lyb','wym','chy'} zoudu = {'wzc','lyb','wym'} girls = {'lsy','mmf','syj'} #issuperset() 檢測當前集合是否是另一個集合的超集 result = boys.issuperset(zoudu) print(result) #issubset() 檢測當前集合是否是另一個集合的子集 result = zoudu.issubset(boys) print(result) #isdisjoint() 檢測2個集合是否不存在交集 存在交集 False result = boys.isdisjoint(girls) print(result) #symmetric_difference() 對稱差集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} result = dreamers.symmetric_difference(girls) print(result) #symmetric_difference_update() 對稱更新差集 dreamers = {'ljl','wc','xy','zb','lsy'} girls = {'mmf','lsy','syj'} dreamers.symmetric_difference_update(girls) print(dreamers) #冰凍集合 #冰凍集合是一種特殊的集合型別,也是集合(集合是列表的話,冰凍集合就是元組) #建立冰凍集合 #一般不會建立空的冰凍集合 var = frozenset() print(var,type(var)) #帶有資料的冰凍集合 var = frozenset(('qs','szx','bjh','acs')) print(var,type(var)) #成員檢測 result = 'szx' in var print(result) #遍歷冰凍集合 for i in var: print(i) #集合推導式(無法得到冰凍集合,可以得到集合,列表,元組,字典型別) result = {i for i in var} print(result,type(result)) #函式 #冰凍集合可以使用集合的函式(不修改集合本身的函式都可以使用) var = frozenset(('qs','szx','bjh','acs')) #copy() result = var.copy() print(result) #集合操作 交集,並集,差集,對稱差集等 不修改冰凍集合本身就能使用:冰凍集合的操作結果都是冰凍集合 var1 = frozenset(('qs','szx','bjh','acs')) var2 = {'szx','bjh','lc','wb'} #冰凍集合操作 result = var1.union(var2) print(result) #普通集合操作(冰凍集合是參考集合) result = var2.union(var1) print(result) # 集合支援一系列標準操作,包括並集、交集、差集和對稱差集 a = t | s # t 和 s的並集 b = t & s # t 和 s的交集 c = t – s # 求差集(項在t中,但不在s中) d = t ^ s # 對稱差集(項在t或s中,但不會同時出現在二者中)
3 字典和幾種常見的儲存資料型比較
-
列表
list
和dict
在進行資料儲存與查詢方面,列表
list
是用時間換取空間, 它儲存資料佔用的空間小,浪費記憶體很少。但是查詢和插入的時間隨著元素的增加而增加; 字典dict
是用空間換取時間, 它儲存資料佔用大量的空間, 記憶體浪費多。 -
字典
set
和dict
集合和字典檢索的原理是一樣的, 唯一區別就是沒有儲存對應的
value
值; 字典的鍵值和集合的元素不可以放入可變物件, 因為無法判斷兩個可變物件是否相等, 也就無法保證集合(字典鍵值)不會有重複的元素。 -
將列表/元組轉化成集合
l = [1, 2, 3, 4] s1 = set(l) t = (1, 2, 3, 4) s2 = set(t)