1. 程式人生 > >列表和字典

列表和字典

出了 value 一是 二維數組 可變 什麽 超出 2個 exe

ist

Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。

比如,列出班裏所有同學的名字,就可以用一個list表示:

>>> classmates = [‘Michael‘, ‘Bob‘, ‘Tracy‘]
>>> classmates
[‘Michael‘, ‘Bob‘, ‘Tracy‘]

變量classmates就是一個list。用len()函數可以獲得list元素的個數:

>>> len(classmates)
3

用索引來訪問list中每一個位置的元素,記得索引是從0開始的:

>>> classmates[0]
‘Michael‘
>>> classmates[1]
‘Bob‘
>>> classmates[2]
‘Tracy‘
>>> classmates[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

當索引超出了範圍時,Python會報一個IndexError錯誤,所以,要確保索引不要越界,記得最後一個元素的索引是len(classmates) - 1

如果要取最後一個元素,除了計算索引位置外,還可以用-1做索引,直接獲取最後一個元素:

>>> classmates[-1]
‘Tracy‘

以此類推,可以獲取倒數第2個、倒數第3個:

>>> classmates[-2]
‘Bob‘
>>> classmates[-3]
‘Michael‘
>>> classmates[-4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

當然,倒數第4個就越界了。

list是一個可變的有序表,所以,可以往list中追加元素到末尾:

>>> classmates.append(‘Adam‘)
>>> classmates
[‘Michael‘, ‘Bob‘, ‘Tracy‘, ‘Adam‘]

也可以把元素插入到指定的位置,比如索引號為1的位置:

>>> classmates.insert(1, ‘Jack‘)
>>> classmates
[‘Michael‘, ‘Jack‘, ‘Bob‘, ‘Tracy‘, ‘Adam‘]

要刪除list末尾的元素,用pop()

方法:

>>> classmates.pop()
‘Adam‘
>>> classmates
[‘Michael‘, ‘Jack‘, ‘Bob‘, ‘Tracy‘]

要刪除指定位置的元素,用pop(i)方法,其中i是索引位置:

>>> classmates.pop(1)
‘Jack‘
>>> classmates
[‘Michael‘, ‘Bob‘, ‘Tracy‘]

要把某個元素替換成別的元素,可以直接賦值給對應的索引位置:

>>> classmates[1] = ‘Sarah‘
>>> classmates
[‘Michael‘, ‘Sarah‘, ‘Tracy‘]

list裏面的元素的數據類型也可以不同,比如:

>>> L = [‘Apple‘, 123, True]

list元素也可以是另一個list,比如:

>>> s = [‘python‘, ‘java‘, [‘asp‘, ‘php‘], ‘scheme‘]
>>> len(s)
4

要註意s只有4個元素,其中s[2]又是一個list,如果拆開寫就更容易理解了:

>>> p = [‘asp‘, ‘php‘]
>>> s = [‘python‘, ‘java‘, p, ‘scheme‘]

要拿到‘php‘可以寫p[1]或者s[2][1],因此s可以看成是一個二維數組,類似的還有三維、四維……數組,不過很少用到。

如果一個list中一個元素也沒有,就是一個空的list,它的長度為0:

>>> L = []
>>> len(L)
0

dict

Python內置了字典:dict的支持,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。

舉個例子,假設要根據同學的名字查找對應的成績,如果用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這個數字存放的內存地址,直接取出來,所以速度非常快。

你可以猜到,這種key-value存儲方式,在放進去的時候,必須根據key算出value的存放位置,這樣,取的時候才能根據key直接拿到value。

把數據放入dict的方法,除了初始化時指定外,還可以通過key放入:

>>> d[‘Adam‘] = 67
>>> d[‘Adam‘]
67

由於一個key只能對應一個value,所以,多次對一個key放入value,後面的值會把前面的值沖掉:

>>> d[‘Jack‘] = 90
>>> d[‘Jack‘]
90
>>> d[‘Jack‘] = 88
>>> d[‘Jack‘]
88

如果key不存在,dict就會報錯:

>>> d[‘Thomas‘]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: ‘Thomas‘

要避免key不存在的錯誤,有兩種辦法,一是通過in判斷key是否存在:

>>> ‘Thomas‘ in d
False

二是通過dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get(‘Thomas‘)
>>> d.get(‘Thomas‘, -1)
-1

註意:返回None的時候Python的交互式命令行不顯示結果。

要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除:

>>> d.pop(‘Bob‘)
75
>>> d
{‘Michael‘: 95, ‘Tracy‘: 85}

請務必註意,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:

>>> key = [1, 2, 3]
>>> d[key] = ‘a list‘
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: ‘list‘

列表和字典