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

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