python第三天(list,元組,dictionary)

zzlp發表於2018-10-20

1.list 列表

列表是最常用的Python資料型別,它可以作為一個方括號內的逗號分隔值出現。

列表的資料項不需要具有相同的型別

建立一個列表,只要把逗號分隔的不同的資料項使用方括號括起來即可。如下所示:

list1 = [`physics`, `chemistry`, 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = [a, b, c, d]

與字串的索引一樣,列表索引從0開始。列表可以進行擷取、組合等。

list的增刪改可以詳細看http://www.runoob.com/python/python-lists.html

2.  tuple 元組

 另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學的名字:

 classmates = (`Michael`, `Bob`, `Tracy`)

不可變的tuple有什麼意義?因為tuple不可變,所以程式碼更安全。如果可能,能用tuple代替list就儘量用tuple。

只有1個元素的tuple定義時必須加一個逗號,,來消除歧義:

t = (1,)
可變的tuple:tuple定義的時候有3個元素,分別是`a``b`和一個list。不是說tuple一旦定義後就不可變了嗎?怎麼後來又變了?
>>> t = (`a`, `b`, [`A`, `B`])
>>> t[2][0] = `X`
>>> t[2][1] = `Y`
>>> t
(`a`, `b`, [`X`, `Y`])
3.Dictionary 字典 

字典是另一種可變容器模型,且可儲存任意型別物件。

字典的每個鍵值 key=>value 對用冒號 : 分割,每個鍵值對之間用逗號 , 分割,整個字典包括在花括號 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

鍵一般是唯一的,如果重複最後的一個鍵值對會替換前面的,值不需要唯一。

>>>dict = {`a`: 1, `b`: 2, `b`: `3`}; >>> dict[`b`] `3` >>> dict {`a`: 1, `b`: `3`}

值可以取任何資料型別,但鍵必須是不可變的,如字串,數字或元組。

示例

(1)假設要根據同學的名字查詢對應的成績,如果用list實現,需要兩個list:

names = [`Michael`, `Bob`, `Tracy`]
scores = [95, 75, 85]

給定一個名字,要查詢對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,list越長,耗時越長。

如果用dict實現,只需要一個“名字”-“成績”的對照表,直接根據名字查詢成績,無論這個表有多大,查詢速度都不會變慢。用Python寫一個dict如下:

>>> d = {`Michael`: 95, `Bob`: 75, `Tracy`: 85}
>>> d[`Michael`]
95

為什麼dict查詢速度這麼快?因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中查詢元素的方法,list越大,查詢越慢。

第二種方法是先在字典的索引表裡(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種查詢速度都非常快,不會隨著字典大小的增加而變慢。

dict就是第二種實現方式,給定一個名字,比如`Michael`,dict在內部就可以直接計算出Michael對應的存放成績的“頁碼”,也就是95這個數字存放的記憶體地址,直接取出來,所以速度非常快。

請務必注意,dict內部存放的順序和key放入的順序是沒有關係的。

和list比較,dict有以下幾個特點:

  1. 查詢和插入的速度極快,不會隨著key的增加而變慢;
  2. 需要佔用大量的記憶體,記憶體浪費多。

而list相反:

  1. 查詢和插入的時間隨著元素的增加而增加;
  2. 佔用空間小,浪費記憶體很少。

所以,dict是用空間來換取時間的一種方法。

dict可以用在需要高速查詢的很多地方,在Python程式碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變物件

這是因為dict根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為雜湊演算法(Hash)。

要保證hash的正確性,作為key的物件就不能變。在Python中,字串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key:

相關文章