python内置数据结构教程第四版答案_Python数据结构--内置数据结构
本文提到的所有內(nèi)容均是基于Python 2.7,在Python 3.x的環(huán)境下可能并不完全適用
什么是數(shù)據(jù)結(jié)構(gòu)
我們可以看一下在百度百科對于數(shù)據(jù)結(jié)構(gòu)是怎么定義的:
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成。記為:
Data_Structure=(D,R)
其中D是數(shù)據(jù)元素的集合,R是該集合中所有元素之間的關(guān)系的有限集合。
---來自百度百科
我的理解是:數(shù)據(jù)結(jié)構(gòu)是對于數(shù)據(jù)的特定組織形式,具體可分為物理結(jié)構(gòu)和邏輯結(jié)構(gòu)(區(qū)別)。
和數(shù)據(jù)結(jié)構(gòu)經(jīng)常一起出現(xiàn)的一個詞是算法。它們兩者之間有什么關(guān)系呢?實現(xiàn)一些特定算法是,應(yīng)該(有時候是必須)采用某些數(shù)據(jù)結(jié)構(gòu)來簡化計算。
知道了以上這些,接下來就一起來看看Python本身自帶的數(shù)據(jù)結(jié)構(gòu)都有哪些吧?
List列表
定義:
a = [1,2,3] #最普通的一個數(shù)組
b = [1, 'Hello', 3.1415926] #多種類型混合組成的數(shù)組
c = [[[1],[2]],[[3],[4]]] #多層嵌套數(shù)組(這里是三層)
訪問:
list原則上是循秩訪問的,也就是說按下標訪問的。
a[0], a[1], a[-1] #訪問a的第一個,第二個元素,最后一個元素
a[1:3], a[-3:], a[:], a[:3] #這是list的切片(slice)操作,分別是訪問a的第2到3個元素(注意左右標的關(guān)系,包含起始位而不包含終止位),訪問倒數(shù)第3個元素到末尾,訪問整個數(shù)組,訪問第一個元素到第3個元素
a[::2], a[::-1]#分別是訪問a的從起始位開始的偶數(shù)位元素,逆序訪問a的元素
簡單總結(jié)一下,訪問單個元素的時候,直接在 '[]' 中輸入需要訪問元素的秩(下標)即可,這里的下標包括正常的排序(0,1,2...)和從末尾計數(shù)的排序(-1,-2,-3...),需要注意的是,如果訪問的秩并不在list范圍內(nèi),比如上面的list中的a=[1,2,3],如果訪問a[3]或者a[-6],就會引發(fā)一個IndexError。
訪問多個元素時,可以使用切片的方法,list[start, end, step], start和end分別是起始下標(默認值為0和list長度減一),step為訪問步長,即每隔幾個元素訪問一個元素(默認值為1)。需要注意的是,切片時下標越界的話并不會引發(fā)任何錯誤,比如上面的list中的a,如果訪問a[1:10000],和a[-10000:]會返回[2,3]和[1,2,3]而不會引發(fā)任何錯誤。這是和按下標訪問時的一個區(qū)別。
更新:
#a=[1,2,3]
a[2] = 4 #修改單個元素,此時a=[1,2,4]
a[1:3] = [8,24] #修改多個元素此時a=[1,8,24]
a[1:3] = [1,2,3,4] #a=[1,1,2,3,4]
a.append(1) #a=[1,1,2,3,4,1]
a.extend([1,2,3]) #在a后面添加一個list,a=[1,1,2,3,4,1,1,2,3]
a.insert(0,1) #在a中0的位置上插入1,a=[1,1,1,2,3,4,1,1,2,3]
刪除:
#a=[1,2,3]
#類似更新的操作方法
a = a[:1] + a[2:] #a=[1,3] 相當于刪除了a[1]
#其他刪除方法
#a=[1,2,3]
del a[1] #刪除a[1]
a.remove(1) #刪除a[1]
a.pop() #彈出a的最后一個元素,和上面兩者不同的是,該方法返回值是彈出的元素
其他操作
#a=[1,1,2,3,4]
a.count(1) #計算a中1的個數(shù),返回2
a.index(1) #返回元素1在a中第一次出現(xiàn)的位置下標
a.index(7) #由于a中沒有7,故引發(fā)ValueError
a.reverse() #a=[4,3,2,1,1]將a逆轉(zhuǎn)
a.sort(), sorted(a) #返回排序好的a 這個方法list.sort(cmp, key, reverse)三個參數(shù)為別為比較方法,比較的鍵,是否逆序,sort和sorted的區(qū)別在于一個是對原list排序,而另一個是將排好序的結(jié)果返回
len(a) #返回a的長度,這里是5
a*2 #返回[1,1,2,3,4,1,1,2,3,4]
max(a),min(a) #分別返回a中的最大值和最小值,這里是4和1
列表推導式:
a = [x for x in range(3)] #a=[0,1,2]
b = [x for x in range(10) if x%2==1] #b=[1,3,5,7,9]
filter,map,reduce:
a = [1,2,3,4,5,6,7]
b = filter(lambda x: x>3, a) #b=[4,5,6,7]
c = map(lambda x:x*x, a) #c=[1,4,9,16,25,36,49]
d = filter(lambda x,y:x+y, a) #d=28
list去重:
#方法1:利用set,不保證去重之后的結(jié)果順序
a = list(set(a))
#方法2:利用dict,不保證順序
a = {}.fromkeys(a).keys()
#方法3:利用set,保持順序
a = list(set(a)).sort(key=a.index)
#列表推導式
b = []
[b.append(i) for i in a and i not in b]
合并兩個有序鏈表:
#方法一:遞歸法
def _recursion_merge_sort2(l1, l2, tmp):
if len(l1) == 0 or len(l2) == 0:
tmp.extend(l1)
tmp.extend(l2)
return tmp
else:
if l1[0] < l2[0]:
tmp.append(l1[0])
del l1[0]
elif l1[0] >= l2[0]:
tmp.append(l2[0])
del l2[0]
return _recursion_merge_sort2(l1, l2, tmp)
def recursion_merge_sort2(l1, l2):
return _recursion_merge_sort2(l1, l2, [])
#方法二:迭代法
def loop_merge_sort(l1, l2):
tmp = []
while len(l1) > 0 and len(l2) > 0:
if l1[0] < l2[0]:
tmp.append(l1[0])
del l1[0]
else:
tmp.append(l2[0])
del l2[0]
tmp.extend(l1)
tmp.extend(l2)
return tmp
tuple元組
定義&訪問:
a = (1, ) #當元組只含一個元素時,
a = (1, 3.14, 'Hello') #元祖中可以包含不同類型的元素
a[0] #返回a的第一個元素
a[0:2] #返回a的第1,2個元素
a[0:2:-1] #返回a的第1,2個元素,并逆序
a.count(1) #返回1
a.index(1) #返回3.14
min(a),max(a) #返回1,3.14
可以發(fā)現(xiàn),元組的定義,訪問和list列表幾乎一樣(除了單個元組聲明時需要加逗號)
那么tuple和list有什么區(qū)別呢?
區(qū)別在于tuple不支持修改,也就是類似于 a[0] = 1 的操作對于元組而言是非法的。不可變的意義在于使tuple內(nèi)的數(shù)據(jù)更安全,不可修改。
Wait!元組真的完全不可修改嗎?定義上來講元組內(nèi)的所有元素一旦定義就不可修改,但如果針對元組內(nèi)的某一個元素進行修改的話是否可行呢?
a = (1,2,[1,2])
a[2][0] = 3 #a=(1,2,[3, 2])
注意!!!以上操作僅供演示,在元組中的元素不應(yīng)該進行修改,如果需要頻繁的修改,建議使用列表。
dict字典
定義&訪問&修改:
a = {1:1, 2:2} #字典是一個key->value的對應(yīng)關(guān)系,原則上key可以是任何不可變類型的值(數(shù)字,字符串,元組)
a[1], a[7],a.get(7) #第一個返回1,第二個引發(fā)KeyError,第三個返回None,實際中推薦使用get的安全訪問方法
a[1] = 3 #a={1:3, 2:2}
a[7] = 7 #a={1:3,2:2,7:7}
a.pop(1) #a={2:2, 7:7}
dict 的優(yōu)勢在于利用了哈希策略,是的對于dict的元素插入,查找速度快(O(1)),弊端在于有一定的空間浪費和無序性。
而list的的插入和查找速度慢于dict(O(n)),但空間利用率好于dict。
set集合
類似dict,但只有key而沒有value,特點是無序性和互異性。
a = set([1,1,2,3]) #返回set([1,2,3])
a.add(4) #set([1,2,3,4])
a.remove(2) #set([1,3,4])
a = set([1,2,3])
b = set([2,3,4])
c = a&b #c = set([2,3])
d = a|b #d = set([1,2,3,4])
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python内置数据结构教程第四版答案_Python数据结构--内置数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 美化输出 错误 警告等信息
- 下一篇: 主mysql删除从服务不同步_MySQL