Python 之数据结构篇
Python的数据结构除了基本的数值外,还有最重要的链表结构,字典,元组等,真正做到了面向对象的要求
下载地址:http://www.python.org/download/
所用编写器IDLE,也就是python自带的,很方便,不同颜色标志不同类型的字符,python 保留字:
and elif global or yield
assert else if pass
break except import print
class exec in raise
continue finally is return
def for lambda try
del from not while
>>> #this is a comment,以#号开头的表示注释,编译器不读取
>>> print ‘fsdfds’
fsdfds
输出打印
python里不需要说明数值类型只要赋值就可以了
>>> a,b,c=0,’d’,3+4j #字符串赋值也可以初始为 b=”” 或者b=’’ 单引号与双引号在PYTHON里作用一样
>>> a
0
>>> b
‘d’
>>> c
(3+4j)
c是虚数,a是整数,b是字符串,python里没有字符的概念,字符是一个长度为一的字符串
>>> c.real
3.0
>>> c.imag
4.0
>>> abs(c)
5.0
虚数的实部,虚部,模求法
>>> x,y,z=[1,2,3],(1,2,3),{‘one’:1,’two’:2,’three’:3}
>>> x
[1, 2, 3]
>>> y
(1, 2, 3)
>>> z
{‘three’: 3, ‘two’: 2, ‘one’: 1} ‘关键字’:值
python里有链表,元组,字典,链表和字典都可改变内部元素,唯有元组不可
>>> del x[0]
>>> del z[‘one’]
>>> x
[2, 3]
>>> z
{‘three’: 3, ‘two’: 2}
>>> x=[1,2,3,4,5,6]
>>> del x[2:4]
>>> x
[1, 2, 5, 6]
链表通过下标,字典通过关键字删除元素
链表的构造:
>>> x=range(10)
>>> y=range(10,20)
>>> z=[x[i]y[i] for i in range(len(x))] #这为一对一相乘,下面为交叉相乘并选出奇数
>>> t=[ij for i in x for j in y if (i*j)%2!=0] #至少有一个for语句,其他的可选
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> z
[0, 11, 24, 39, 56, 75, 96, 119, 144, 171]
>>> t
[11, 13, 15, 17, 19, 33, 39, 45, 51, 57, 55, 65, 75, 85, 95, 77, 91, 105, 119, 133, 99, 117, 135, 153, 171]
>>> x=1,2,3
>>> y=3,2,1
>>> z=[(x[i],y[i]) for i in range(len(x))]
>>> z
[(1, 3), (2, 2), (3, 1)]
>>> 由此可以得到元组序列
链表可作为栈和队列使用,这里要用到她的方法pop(),append()
>>> x.append(10)
>>> x.append(11)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> x.pop()
11
>>> x.pop()
10
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 上面实堆栈使用
>>> x.append(10)
>>> x.pop(0)
0
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 上面是队列使用
链表字典可以嵌套使用
>>> x=range(10)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> r=’H’,’e’,’l’,’l’,’o’
>>> r
(‘H’, ‘e’, ‘l’, ‘l’, ‘o’)
>>> x.append(r) 从后面添加
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (‘H’, ‘e’, ‘l’, ‘l’, ‘o’)]
>>> x.insert(0,r) 从指定位置添加,0代表最前面的
>>> x
[(‘H’, ‘e’, ‘l’, ‘l’, ‘o’), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (‘H’, ‘e’, ‘l’, ‘l’, ‘o’)]
>>> x[0][0] #这句和下面一句是不一样的,相当于s=x[0] 然后取s[0]==x[0][0]
‘H’
>>> x[0]
(‘H’, ‘e’, ‘l’, ‘l’, ‘o’)
链表元组等还有一个属性就是切片,形如a[offset:end] 她会取出a[]中的从offset到end-1个元素
如果不指定offset就会取从a[0]到a[end-1],如果不指定end就会取a[offset]到a[len(a)]
即到最后一个元素
>>> r=’H’,’e’,’l’,’l’,’o’
>>> r[1:]
(‘e’, ‘l’, ‘l’, ‘o’)
>>> r[:3]
(‘H’, ‘e’, ‘l’)
>>> r[:3]+r[3:]
(‘H’, ‘e’, ‘l’, ‘l’, ‘o’)
>>> r[1:3]
(‘e’, ‘l’)
对于链表元组这种序列化的对象可以用下标引用,可字典不是序列化的,她是无序的,她通过关键字来引用,python还提供另外一种下标,就是负数下标,因为-0==0 所以没有-0一项,只从-1开始,
(‘H’, ‘e’, ‘l’, ‘l’, ‘o’)
0 1 2 3 4
-5 -4 -3 -2 -1
>>> r=’H’,’e’,’l’,’l’,’o’
>>> r[-1]
‘o’
>>> r[-5]
‘H’
链表还有一些方法
count(x) 计算元素x在链表中出现的次数
remove(x) 删除链表中第一个元素为x的,没有则返回错误,可以捕获
index(x) 返回第一个元素为x的下标,没有就返回错误,
extend(L) 添加指定的链表L来扩充链表,相当于a[len(a):]=L
sort(),reverse() 对链表排序和倒排序
元组创建时候可以不加括号,输出时候有括号
>>> x=’dsf’,1,’dd’,5.23
>>> x
(‘dsf’, 1, ‘dd’, 5.2300000000000004)
>>> f=’s’,;t=() # f=’s’, 后面加个逗号,创建长度为1的元组,也许分开看的更明显
>>> len(f);len(t) #此处的”;”表示后面是不用换行可以继续执行的代码
1
0
>>> f=’s’,
>>> f
(‘s’,)
对于非数值形的对象如果用赋值或者copy等方法,其实是传地址,而非传值,对其中的任何一个对象标志的改变都最终都将改变内存中的实际对象,有个方法可以改变这种,import copy,然后引用copy模块的方法,copy.deepcopy()
>>> import copy
>>> x=[1,2,3,4]
>>> x
[1, 2, 3, 4]
>>> y=x
>>> y.remove(1) 此处对Y的改变也影响到X,是不是?
>>> x
[2, 3, 4]
下面用到的deepcopy()改变了这种状况。。
>>> x=[1,2,3,4]
>>> x
[1, 2, 3, 4]
>>> y=copy.deepcopy(x)
>>> y
[1, 2, 3, 4]
>>> y.remove(1)
>>> y
[2, 3, 4] #Y改变了,可X依旧是原来的X,此处传给Y的是X的值而不是地址了。。
>>> x
[1, 2, 3, 4]
>>>
再来说说字典dict:
>>> x={‘one’:1,’two’:2,’three’:3,’four’:4} #构造
>>> x
{‘four’: 4, ‘three’: 3, ‘two’: 2, ‘one’: 1}
>>> x[‘one’] #通过关键字对字典检索
1
>>> del x[‘one’]#字典是可变的不象元组所以可以通过关键字来删除
>>> x[‘one’] #删除过后你如果再引用删除的元素,那就会出错误
#如下面的报错KeyError:
Traceback (most recent call last):
File “”, line 1, in -toplevel-
x[‘one’]
KeyError: ‘one’
#字典可以通过方法keys()和values()来列出关键字链表和值链表,如下::
>>> x.keys()
[‘four’, ‘three’, ‘two’]
>>> x.values()
[4, 3, 2]
>>> x.has_key(‘one’)#此处用has_key(x)来确定字典中是否有x,因为上面删除了’one’所以False
False
>>> x.has_key(‘two’)
True
#下面这段代码演示了如何通过有关键字-值对元组的链表来构造字典,通过dict()方法。。
>>> x=[‘one’,’two’,’three’,’four’]
>>> y=[1,2,3,4]
>>> c=[(x[i],y[i]) for i in range(len(x))]
>>> c
[(‘one’, 1), (‘two’, 2), (‘three’, 3), (‘four’, 4)]
>>> dict(c)
{‘four’: 4, ‘three’: 3, ‘two’: 2, ‘one’: 1}
>>>
至此对数据结构有所基本了解。。。