Python中的數據結構
這里總結一下Python中的內置數據結構(Built-in Data Structure):列表list、元組tuple、字典dict、集合set,涵蓋的僅有部分重點,詳細地去介紹每個知識點並未涉及。
列表list
list的顯著特征
-
列表中的每個元素都可變的
意味着可以對每個元素進行修改和刪除 -
列表是有序的,每個元素的位置是確定的,可以用索引去訪問每個元素
-
列表中的元素可以是Python中的任何對象
可以為任意對象就意味着元素可以是字符串、整數、元組、也可以是list等Python中的對象。
>>> x = [1,2,3]
>>> y = {'name':'Sakura'}
>>> z="Test"
>>> a=[x,y,z]
>>> a
[[1, 2, 3], {'name': 'Sakura'}, 'Test']
覺得Python中的list和C語言中的數組蠻像的,只是list中的元素類型可以為Python中的任意對象,C中的數組只能是同種類型。當訪問他們中的元素時,都可采用索引。這里需要注意的是,list不僅可以向數組那樣正向索引也可以反向索引。
list中的正反索引
list中的增刪查改
list中有很多的方法,這里僅介紹對list中元素進行增刪查改的方法。
- 利用insert()和分片將元素添加到指定位置 , 利用remove()和關鍵字del對
元素進行刪除
需要注意分片[a:b]中的位置不包含位置b,利用[a,a]可以將元素添加至a位置
-
利用正反索引對元素進行查找
-
對元素修改可以直接賦值替換
-
列表中還有其他方法如pop()刪除末尾元素,pop(i)刪除指定位置i的元素,append()向末尾添加元素
list函數
可以通過list將序列創建為列表
Python中包含6中內建的序列:列表,元組,字符串、Unicode字符串、buffer對象和xrange對象。
>>> list("Hello,world")
['H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd']
其實list為一種類型並非函數,但此處二者並無多大區別。下面的tuple、dict都如此。
元組tuple
- 元組可以理解為一個固定的列表,一旦初始化其中的元素便不可修改(認真理解這句話),只能對元素進行查詢
>>> test=(1,2,3)
>>> test
(1, 2, 3)
>>> test[1]=4
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> test[1:1] = 4
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> test[1]
2
從上可知,tuple不支持對元素的修改(包括刪除),tuple一初始化便固定下來了。
再來看一個例子。
>>> test=('a','b',['A','B'])
>>> print(test)
('a', 'b', ['A', 'B'])
>>> test[2][0]='x'
>>> test[2][1]='y'
>>> test
('a', 'b', ['x', 'y'])
這里看似元素中的元素改變了,可是仔細分析下,元組中的第三個元素是一個列表。
代碼3.4行改變的是列表中的值,元組所指的這個元素列表並沒有改變,需要注意這點!
這就涉及到Python中的可變對象和不可變對象,像list這樣的就是可變對象,tuple便是不可變對象。
-
元組是固定的列表,那么元組的意義何在呢?
因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple
並且需要注意元組中元素的可變性!! -
空的tuple可以記為(),若只有一個元素的tuple記為(1,)
因為記為(1)的話,這個實際代表的是數字1,此時()是數學公式中的小括號 -
因為元組是固定的列表,所以其內置的大多數的方法和列表是差不多的。
-
可以通過tuple將序列轉換為元組,用法和list一樣
>>> tuple('Hello,world!')
('H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!')
字典dict
字典這個概念就是基於現實生活中的字典原型,生活中的使用名稱-內容對數據進行構建,Python中使用鍵(key)-值(value)存儲,也就是C++中的map。
dict的顯著特征
-
字典中的數據必須以鍵值對的形式出現
-
鍵不可重復,值可重復
鍵若重復字典中只會記該鍵對應的最后一個值 -
字典中鍵(key)是不可變的,為不可變對象,不能進行修改;而值(value)是可以修改的,可以是任何對象。
在dict中是根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。
dict的增刪查改
- 可以采用“鍵值對”的方法和update()方法向字典中添加元素
刪除可以使用關鍵字del以及pop()方法
- 查詢采用如查詢列表元素的索引方式,使用鍵作為索引查找值
若元素不存在會報錯,在進行查找前,可以通過以下兩種方法判斷key是否存在:
① 成員資格運算符--in運算符
② get()方法(值不存在時返回NULL,也可指定返回的值)
>>> test={'Mon':1}
>>> 'Fri' in test
False
>>> test.get('Fri')
>>> test.get('Fri',-1)
-1
-
對值得修改可以采用直接覆蓋原值的方法
-
dict中的元素是無序的,不可以采用分片。
dict函數
可以使用dict,通過其他映射或者(鍵,值)對的序列建立字典。
>>> test=[('name','Sakura'),('age',20)]
>>> d = dict(test)
>>> d
{'name': 'Sakura', 'age': 20}
dict也可以使用關鍵字參數創建字典,也可用映射作為dict參數,dict若不帶任何參數,將返回一個空字典
>>> d = dict(name='Sakura',age=20)
>>> d
{'name': 'Sakura', 'age': 20}
>>> a=dict()
>>> a
{}
集合set
集合更接近數學上集合的概念。集合中每個元素都是無序的、不重復的任意對象。
可以通過集合去判斷數據的從屬關系,也可以通過集合把數據結構中重復的元素減掉。集合可做集合運算,可添加和刪除元素。
集合的創建
創建集合時需要用list作為輸入集合,可通過add()方法增加元素,remove()方法刪除元素
>>> test=set([1,2,3])
>>> test
{1, 2, 3}
>>> test.add(3)
>>> test
{1, 2, 3}
>>> test.add(6)
>>> test
{1, 2, 3, 6}
>>> test.remove(3)
>>> test
{1, 2, 6}
集合中重復的元素會被過濾掉
集合運算
Python中的集合也可以進行集合的之間的交、並等運算
>>> s1 = set([1,2])
>>> s2=set([2,3])
>>> s1 & s2 # s1與s2
{2}
>>> s1 | s2 # s1與s2進行或運算
{1, 2, 3}