1. 程式人生 > >Python中的字典和集合

Python中的字典和集合

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
    # 修改資料:變數名[鍵] = 值	(字典中存在對應的鍵)
    d['kendny'] = 100 # 通過鍵名取字典的值, 如果鍵名不存在, 就會報錯; 通常可以通過 in或者get()方法判斷鍵是否存在 if 'Thomas' in d: value = d['Thomas'] # 或者 value = d.get('Thomas'); # 不存在value什麼值都沒有
  • 常見操作字典的函式

函式 說明 例項
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 字典和幾種常見的儲存資料型比較

  • 列表listdict

    ​ 在進行資料儲存與查詢方面,列表list是用時間換取空間, 它儲存資料佔用的空間小,浪費記憶體很少。但是查詢和插入的時間隨著元素的增加而增加; 字典dict是用空間換取時間, 它儲存資料佔用大量的空間, 記憶體浪費多。

  • 字典setdict

    ​ 集合和字典檢索的原理是一樣的, 唯一區別就是沒有儲存對應的value值; 字典的鍵值和集合的元素不可以放入可變物件, 因為無法判斷兩個可變物件是否相等, 也就無法保證集合(字典鍵值)不會有重複的元素。

  • 將列表/元組轉化成集合

    l = [1, 2, 3, 4]
    s1 = set(l)
    
    t = (1, 2, 3, 4)
    s2 = set(t)