重要數據結構——list,tuple,set,dict

基本特性和創建對比:

列表:

可變的,可重複的,有序的 ,線性的
列表個體稱爲元素,元素可以是任一對象
一定均勻分配每個元素的內存存儲空間,因爲它靠偏移量來搜索元素,列表中存放的都是數據的內存地址,而不是數據,真正的數據存放在其他地方。
  • 列表創建:
    lst= list()
    lst = []
    lst =list(iterable) >>> lst = list(range(5))
    lst = [2, 6, 9, 'ab']

元組:
不可變,可重複的,有序的,只讀的(沒有增刪改查)
元組個體稱爲元素,元素可以是任一對象
對於不需要修改的序列,我們最好將其定義爲元組。(因爲元組的結構相比列表更簡單,所以它比列表更加節省內存空間)

  • 元組創建:
    t = () , t=tuple():創建一個空的元組
    t = tuple(range(1,7,2)) :可迭代對象iteratable
    t = (1,) :創建一個元素的元組注意要有個逗號
    t = (1,2,3) 6 , t =(2,3,4)+(4,5,6,7) , t = t3:元組是不可修改的,但是這裏的乘號和加號表示生成一個新的元組

集合(set):

可變的,無序的,不可重複的
有序纔是線性的,無序不是線性的。set集合的元素是不可以索引的,因爲set是無序的。但是set是可以迭代,這就是爲什麼可索引的一定是可迭代的,但是可迭代的不一定是可索引的。
set的元素必須可以hash的。
只要是不可變類型的數據結構都是可hash的(hashable),具體如下:
數值型int、float、complex
布爾型True、False
字符串string、bytes
tuple
None:空值也是可以hash的,因爲它是一個常量,不可變。
爲什麼說可變類型的數據結構不可hash呢?因爲只要數據一變,hash後的key也會跟着變。這對以hash值爲索引依據的set集合而言是不可接受的,需要頻繁的維護hash表。得不償失。

  • set創建:
    s=set():創建一個空的集合(注意:s = {}是創建字典)
    s = set{range(1,7,2)} :可迭代對象iteratable
    s= {(2,3),23,"w",[23,4]} :錯的!! list不可hash。

字典:

可變的,無序的,key值不重複
字典是key:value鍵值對的數據集合
創建字典的時候一定要注意,key一定要是可hash的數據結構,否者會拋出TypeError的異常。

  • 字典創建:
    d = dict() 或者d = {} :創建一個空字典 (d=dict(er =34) 對的 d={er=34}錯的)
    dict(iterable, **kwarg):使用可迭代對象和name,value對構造字典,不過可迭代對象的每一個元素都必須是一個二元結構
    d = {'a':10, 'b':20, 'c':None, 'd':[1,2,3]}:直接窮舉法

字典元素的訪問:
d[key]:返回key對應的值value,key如果不存在則拋出KeyError異常
get(key[, default]):返回key對應的值value,但是如果key不存在則返回缺省值,如果沒有設置缺省值就返回None
setdefault(key[, default]):如果key存在,返回key對應的值value。如果key不存在,則添加key:value對,value爲default,並返回default,如果default沒有設置,缺省爲None,一定要注意setdefault不能夠修改key的value,當key存在時,它只是返回key的value,並不會修改key的值。


增刪改查對比:
list:

  • 增加和修改:
    append(object) :在列表尾部追加元素,它是就地修改列表。append的時間複雜度是O(1),因爲它是在列表的尾部追加元素的,新追加的元素不會影響舊元素的內存地址,因此它是高效的。
    列表推導式:[i for i in range(10)]。
    [1]10:運算符重載。
    insert(index, object)
    :在指定索引index處插入元素object,它也是就地修改列表,因此返回值也是None,這也就意味着沒有新的列表產生。它的時間複雜度是O(n),因爲在列表中間插入新的元素,那麼該元素後面的老元素將會全部會被往後挪動一個地址空間,所以它的效率是低下的,也應該儘量少用,否者影響代碼效率。
    extend(iteratable) :就地修改,將可迭代對象的元素追加進來,返回None,時間複雜度同樣是O(n)
    (+) :連接操作,將兩個列表連接起來,產生一個新的列表,原列表不變。加號兩邊的數據類型一定要一致,否者就會拋出TypeError異常。+號非常的佔用內存空間。因此每使用一次加號,就相當於生成了一個新的對象,並且在內存中新開闢一段地址空間用於保存該對象。一旦加號使用量大了,那麼這個過程就會反覆重現,快速消耗內存。

    (x):重複操作,稱爲”運算符重載“,將列表中的每個元素重複n次,產生一個新的列表,原列表不變。注意:如果列表中的元素是“複雜類型(引用類型)”,即其他的數據結構類型,那麼重複的只是內存地址,而不是真正的數據,並且重複的多個內存地址都是指向同一個數據。如果列表的元素是“單值(數字、字符串)”,則重複的就是數據本身,而不是內存地址。**

  • 刪除::
    remove(value) :就地修改,。從左至右查找第一個匹配value的值,移除該元素,和count、index一樣,remove的時間複雜度也是O(n)的,原理一樣,因爲它同樣需要遍歷列表,從列表中先找到value,之後才能夠remove。

    pop([index]) :不指定索引index時,就從列表尾部彈出一個元素,並將該元素返回給調用者。

    clear() :清空列表的所有元素,剩下一個空列表。,能不用clear就不用,儘量少用。

set:

  • 增加:
    add(elem):就地修改,增加一個元素到set中,如果增加的元素已經在集合中存在,則什麼都不做。
    update(*others):就地修改,將一個可迭代的序列合併到set集合中來,參數others必須是可迭代對象
  • 刪除:
    remove(elem):就地修改,從set中移除一個元素,若元素不存在,會拋出KeyError異常。
    discard(elem):就地修改,從set中移除一個元素,與remove不同的是,如果元素不存在則什麼都不做。沒有返回值(即返回值爲None)
    pop():就地修改,隨機移除集合中的某個元素,並返回該移除的元素。注意pop函數不能夠接收參數,否者報語法錯誤。如果是空集合,則返回KeyError異常
    clear():就地修改,移除集合中的所有元素。
  • 修改和查詢
  • set集合不提供元素修改方法:
    set集合中是不提供元素修改的方法的,對於一個集合,要麼刪除,要麼加入新的元素,沒必要修改元素。(因爲集合元素是不重複的)
    set集合也不提供元素查詢方法:
    因爲set集合是非線性的數據結構,無法索引(計算機內部還是通過hash key線性索引的,只不過對人來說是無序的。)但是可以使用for循環遍歷迭代顯示所有元素。因爲set集合也是可迭代對象。

dict:

  • 增加和修改:
    d[key] = value:就地修改,如果key存在,則將key對應的值修改爲value,如果key不存在則添加新的key:value對。
    update([other]):就地修改,使用另一個字典的key:value對來更新本字典,如果key不存在,就添加,key存在,則覆蓋已經存在的key對應的值。

  • 刪除:
    pop(key[, default]):如果key存在,移除它,並返回它的value,key不存在,返回指定的default值,若default未設置,並且key不存在,則拋出KeyError異常
    popitem():隨機移除並返回一個鍵值對,當字典爲empty時,拋出KeyError異常
    clear():清空字典。
    del語句:del是語句,而不是函數,因此使用del刪除變量名時,一定要注意不要使用括號del()。del語句的作用就是用來刪除變量名的,它並沒有真正的刪除數據,它的作用實際上就是在內存中減少一個數據的引用計數,python不提供給用戶直接刪除垃圾的方法,而是由GC刪除垃圾。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章