python學習筆記(二)數據結構與算法

最初學習編程時,是先學了數據結構與算法才學透C++的一些使用,因此先從數據結構和算法的概念開始說起這節,然後再介紹幾種Python內置的數據類型,及操作數據的算法。

數據結構

數據結構是對數據進行組織的方式。要與數據類型區別開來,二者很相似,但是是完全不同的概念。
比如一個字符串’name’,它的數據類型是字符串,包括其值和對字符串的操作方法,而數據結構則與其如何組織構造這name幾個字符有關,更多地是描述的其數據存在的關係。二者側重點不一樣。

算法

算法是解決問題的一組正確無誤的操作的描述。它和函數有一定相似,但也是完全不同的概念。
比如現在有一種算法可以實現對數據排序,用自然語言也可以描述出其步驟,這也是算法,是一種抽象的概念。而函數是有其具體環境的。

開始

現在回到Python的內容。
先說幾種Python的內置數據類型:
1. 列表list
list是一個有序集合,和c++中的數組較類似,但不同的是,c++中的數組每個元素都必須是同類型的,而list並沒有這個限制。使用方法如下:

list = [1,'jack','m',15]

使用中括號將各個元素括起來即可得到一個list。
對其進行的操作有如下幾種常用的:

list.insert(1,95)#插入一個變量95到位置1
list.pop()#刪除最後一個元素
list.append(25)#插入25到最後
a = list[2]#獲得下標爲2的元素
b = list[-2]#獲得倒數第二個元素
c = list[1:3]#獲得1、2個元素

和c++一樣,其下標是從0開始的,但不同的是,其下標可以爲負數,用於在不知道列表長度時獲取末尾的元素。
注意:如果不知道列表長度,不要使用insert往末尾添加元素,應使用append(使用內置函數len可以獲取列表長度)

2. 元組tuple
tuple也是一個有序集合,與list不同的是,它的元素一經確定就不能再改爲或者是增添別的元素。其使用方法:

tp = ('student',[1,'jack','m',15])

tuple有兩個元素,一個是’student’一個是一個列表。在這種情況下,兩個元素不能再被變更爲其他的元素,tuple本身也不能再增加任何元素。但依然可以對其中的列表進行操作:

tp[1].append(95)

tuple操作方法與list基本相同,只是沒有能改變結構的方法,比如pop、append等。

介紹完了兩個基本的數據類型,然後介紹一些控制語句來對它們進行操作:
1. 條件分支語句
條件語句即對條件進行判斷,根據判斷結果選擇不同分支,使用方法如下

a = ['Jack',12,95]
if(a[1]>18):
    print 'adult'
elif(a[1]>6:
    print 'teenager'
else:
    print 'kid'

程序對列表的第二項進行判斷(假設爲年齡),根據其數值輸出不同的結果。顯然這段應該輸出teeager。

2. 循環語句
單有條件語句還不夠。許多時候要做重複的操作,而且操作次數也是一個變量,不能順序寫複數個語句。這時需要循環語句。
Python有兩種循環語句,一種是專用於對集合的遍歷的for語句,一種是通用的while循環語句。
先說while語句。while語句格式和c++類似,也是一個條件 語句塊的形式:

n = 0
while(n<10):
    n++

for語句是專用於遍歷的,結合一個綜合例子,給出其使用方法如下:

boy1 = [3,'Jack','m',15]
boy2 = [1,'Mark','m',19]
boy3 = [2,'Tim','m',25]
boys = (boy1,boy2,boy3)
for boy in boys:
    if(boy[3]>18):
        boy.append('adult')
    elif(boy[3]>6):
        boy.append('teenager')
    else:
        boy.append('kid')
print boys

for中的boy變量是對tuple每一項的引用,因此對其進行操作就相當於通過下標獲取再操作。
這段程序的作用是,對tuple中的每個列表添加一項,代表其年齡段。

再回到篇頭說的數據結構與算法,結合具體的數據類型以及一系列控制操作來再述一遍。
list、tuple的數據結構其實是一樣的,都是一個有序的元素集合,從元素之間的關係上,它們都是偏序關係。不同的是他們的操作方法,而數據類型是數據以及操作方法的集合,所以他們是不同的數據類型。
再來看算法,上面的程序可能不太適合作爲算法的例子,下面利用列表和循環實現一個斐波那契數列:

fab = [0,1]
n = 2
while(n<15):
    fab.append(fab[n-1]+fab[n-2])
    n = n+1
print fab

我們描述斐波那契數列用的是數學上的遞歸方法:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)。而要得到一個斐波那契數列的列表(結果),則需要一個操作過程(算法)。這段代碼就可以說是一個生成斐波那契數列的算法。

再來幾個數據類型

上面說到的list和tuple有很大的相似性,未免有些單調。這裏再看一些別的結構不同的數據類型。
1. 字典dict
字典是具有極快查找速度的鍵-值對結構數據類型。它的操作方法類似於list,但不同的是,list的索引是下標,而dict的索引是
使用方法如下:

d = {'Jack':boy1,'Mark':boy2,'Tim':boy3}
print d['Jack']

其中’Jack’是鍵,而boy1是值。字典就是通過鍵來索引值,就好比查字典通過拼音來翻閱,會非常快查到,而列表只能一行行找,非常慢。所有需要頻繁查找的結構都可以用字典來實現。
要插入新的鍵值對,或者刪除:

d['Tom'] = ['Tom',12]
if('Tom'in d):
    d.pop('Tom')

注意:在刪除或索引的時候要先檢查該值是否在其中。實例見上面的if語句。

2 . 集合set
set是一個無序的不重複的數據集。它和數學上的集合很相似。操作簡單,方法如下,不再多說:

s = set([1,2,3,4])
s.add(5)
s.remove(2)

注意:set的聲明需要set關鍵字

參考資料:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738250465218a4f3a99994457a8db2fef7ce773c4000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章