一、数据结构
Python中存在三种重要的数据结构,即列表、元组和字典,下面将一一介绍这三种数据结构。
列表:
列表是处理一组有序项目的数据结构,每个项目之间用逗号隔开,列表中的项目应该包括在方括号中。一旦创建了列表,就可以往列表中添加、删除和搜索其中的项目。添加项目可以通过append方法实现,删除项目可以通过del函数实现,搜索项目可以使用索引的方法。
例子:
In [1]: #定义列表
...: ls = ['Monday','Tueaday','Wednesday','Thursday','Friday','Saturdat']
In [2]: print ls
['Monday', 'Tueaday', 'Wednesday', 'Thursday', 'Friday', 'Saturdat']
In [3]: #往列表中添加项目
...: ls.append('Sunday')
...: print ls
...:
['Monday', 'Tueaday', 'Wednesday', 'Thursday', 'Friday', 'Saturdat', 'Sunday']
需要注意的是,append方法每次只能往列表中加入一个项目。
In [4]: #使用循环将列表中的一周7天打印出来
...: print 'A week has 7 days, there are:'
...: for i in ls:
...: print i
...:
A week has 7 days, there are:
Monday
Tueaday
Wednesday
Thursday
Friday
Saturdat
Sunday
In [5]: #使用del函数删除列表中的某一项
...: del ls[0] #删除列表中的第一个项目
In [6]: print ls
['Tueaday', 'Wednesday', 'Thursday', 'Friday', 'Saturdat', 'Sunday']
列表中的内容增值可减,其属于可变的数据结构类型。
列表的容忍度非常高,可以装下很多种东西,如列表中可以放置任何数据类型,如字符串、数值、列表、元组、字典等。
In [7]: ls2 = ['LiuShunxiang',26,['Male','DA',1],(1,2,3),{'Friend':'xxx'}]
...: print ls2
...:
['LiuShunxiang', 26, ['Male', 'DA', 1], (1, 2, 3), {'Friend': 'xxx'}]
元组
元组与列表类似,其不同之处在于元组是不可变的数据结构类型,无法实现往元组中增加或减少元素。元组通过圆括号将元素组合在一起,中间用逗号隔开。
例子:
In [9]: t = ('1a','2b','3c','4d','5e','6f','7g')
...: print t
...:
('1a', '2b', '3c', '4d', '5e', '6f', '7g')
元组最普遍的用法是与转义字符一起使用
In [10]: print ' Name: %s Gender: %s Age: %d\n Score: %.2f'%('LiuShunxiang\n','Male\n',26,89.736)
Name: LiuShunxiang
Gender: Male
Age: 26
Score: 89.74
其中,\n为转义字符,表示换行;%s、%d和%.2f表示数据类型,分别为字符型、整数型和浮点型,且浮点型数据保留2位。
字典
字典的本质就是将多个项目对紧紧的联系在一起,正如身份证号对应一个人,Python的术语将“身份证”命名为键,“人”命名为值。这里需要强调的是,键必须是唯一的,而值可以是重复的。字典的写法如下:
{key1:value1,key2:value2,...,keyn:valuen}
键与值之间用冒号隔开,多个键值之间用逗号隔开,他们用花括号括起来。字典也可以添加或删除键值,其为可变的数据结构类型。
例子:
In [11]: MemInfo = {'id1':'abc','id2':'bcd','id3':'cde','id4':'def'}
...: print MemInfo
...:
{'id4': 'def', 'id2': 'bcd', 'id3': 'cde', 'id1': 'abc'}
字典不像列表和元组可以通过索引获取指定位置的值,而字典只能够通过指定键才能返回对应的值。
In [12]: print "id1's name is:",MemInfo['id1']
id1's name is: abc
或者
In [13]: print "id3's name is %s"%MemInfo['id3']
id3's name is cde
添加键值
In [14]: MemInfo['id5'] = 'LiuShunxiang'
...: print MemInfo
...:
{'id4': 'def', 'id5': 'LiuShunxiang', 'id2': 'bcd', 'id3': 'cde', 'id1': 'abc'}
字典中不存在顺序,其不属于序列,所以新添加的键值没有放在当前字典的最后一个。
删除键值
In [15]: del MemInfo['id2']
...: print MemInfo
...:
{'id4': 'def', 'id5': 'LiuShunxiang', 'id3': 'cde', 'id1': 'abc'}
通过字典的items方法可将每一对键值以元组的形式存放在列表中。
In [16]: MemInfo.items()
Out[16]: [('id4', 'def'), ('id5', 'LiuShunxiang'), ('id3', 'cde'), ('id1', 'abc')]
可通过for循环把对应的键值打印出来。
In [17]: for id, name in MemInfo.items():
...: print id,name
...:
id4 def
id5 LiuShunxiang
id3 cde
id1 abc
或者
In [18]: for ID, Name in MemInfo.items():
...: print 'ID is:%s, Name is:%s'%(ID,Name)
...:
ID is:id4, Name is:def
ID is:id5, Name is:LiuShunxiang
ID is:id3, Name is:cde
ID is:id1, Name is:abc
二、切片
我们知道,字符串、列表和元组都是序列,即他们都是有顺序的,这样就可以根据这些序列的索引取出一个项目或使用切片取出连续的一组项目,这里就以字符串为例。
需要指出的是,Python索引从0开始,这不同于R语言从1开始,而且取不到切片的上限,下面以例子说明问题。
In [19]: mystring = 'LiuShunxiang'
...: print mystring
...:
LiuShunxiang
取出第一个字符
In [20]: print mystring[0]
L
取出最后一个字符
In [21]: length = len(mystring)
...: print length
...: print mystring[len(mystring)-1]
...:
12
g
取出'Liu'
In [22]: print mystring[0:2]
Li
发现并没有取全,是因为切片的上限2取不到,只能取到1的位置。
In [23]: print mystring[0:3]
Liu
或者
In [24]: print mystring[:3]
Liu
取出'xiang'
In [25]: print mystring[7:12]
xiang
或者
In [26]: print mystring[7:]
xiang
但这样有些复杂,需要从头开始数,如果字符串很长的话,数起来就麻烦了。可以考虑从后往前取。
In [27]: print mystring[-5:-1]
xian
仍然没有取全,因为-5的位置取不到,只取到了倒数第二个位置。
In [28]: print mystring[-5:]
xiang
上面的切片有一个规律,即切片的第一个值小于第二个值,如果大于等于第二个值呢?
In [29]: print mystring[0:0]
...: print mystring[3:0]
...:
发现不返回任何结果,且没有报错。其实切片有3个参数,即[start,end,step],默认情况下,step=1,所以print mystring[3:0]没有返回结果。
In [30]: print mystring[2::-1]
uiL
这样就能返回结果,但为逆序结果,如果想使结果再次颠倒一下,可以再原来的结果中再使用[-1::-1 ]切片。
In [31]: print mystring[2::-1][-1::-1 ]
...: print mystring[-1:-6:-1][-1::-1 ]
...:
Liu
xiang