1.list 列表
列表是最常用的Python資料型別,它可以作為一個方括號內的逗號分隔值出現。
列表的資料項不需要具有相同的型別
建立一個列表,只要把逗號分隔的不同的資料項使用方括號括起來即可。如下所示:
與字串的索引一樣,列表索引從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 對用冒號 : 分割,每個鍵值對之間用逗號 , 分割,整個字典包括在花括號 {} 中 ,格式如下所示:
鍵一般是唯一的,如果重複最後的一個鍵值對會替換前面的,值不需要唯一。
值可以取任何資料型別,但鍵必須是不可變的,如字串,數字或元組。
示例
(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有以下幾個特點:
- 查詢和插入的速度極快,不會隨著key的增加而變慢;
- 需要佔用大量的記憶體,記憶體浪費多。
而list相反:
- 查詢和插入的時間隨著元素的增加而增加;
- 佔用空間小,浪費記憶體很少。
所以,dict是用空間來換取時間的一種方法。
dict可以用在需要高速查詢的很多地方,在Python程式碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變物件。
這是因為dict根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為雜湊演算法(Hash)。
要保證hash的正確性,作為key的物件就不能變。在Python中,字串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key: