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