1.寻列概述
Python中最基本的数据结构就是序列(sequence),序列中的每个元素被分配一个序号——即元素的位置,也称为索引。第一个元素索引为0,第二个为1,一次类推。
python中包含六种内建序列,下面我们将着重讨论最常用的两种:列表和元组。其他的内建序列类型有:字符串,Unicode字符串,buffer对象和xrange对象。
列表和元组的主要区别在于:列表可以修改,元组不能修改.在需要操作一组数值的时候,序列很好用。可以用序列表示数据库中一个人的信息,例如:
>>> edward=['John',42]
>>> sun=['sun',22]
>>> database=[edward,sun]
>>> database
[['John', 42], ['sun', 22]]
注意:python中还有一种数据结构叫做容器(container),容器基本上是包含其他对象的任意对象。序列和映射是两类主要的容器。还有一种容器就是集合。以后我们会经行详细的介绍。
2.通用序列的操作
所有的序列都可以经行某些特定的操作。这些操作包括:索引(indexing)、分片(slicing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列、计算序列长度、找出最大元素和最小元素。注意:序列还有一个重要操作就是迭代(依次对序列中的某个元素的操作执行某些重复动作),在以后我们会做详细介绍。
(1)索引
序列中所有元素都是有编号的——从0开始。这些元素可以通过编号访问而得。例如:
>>> a="123"
>>> a[2]
'3'
(字符串本身就是一个序列)
这就是索引。可以通过索引获取到所有的元素。使用负数索引时,python会从右边开始计数:
>>> a[-1]
'3'
字符串的字面值可以直接使用索引,而不需要用一个变量引用他们:
>>> 'hello'[3]
'l'
(2)分片
使用索引来访问单个元素类似,可以使用分片操作来访问一定范围内的元素。分片通过冒号隔开的两个索引来实现:
>>> a="123456789"
>>> a[2:5]
'345'
注意:第一个索引是需要获取的第一个元素的编号,第二个索引是需要获取的最后一个元素的下一个元素的编号(也就是获取到的片段包括第一个索引,不包括第二个索引,截止到第二个索引)
一.优雅的捷径
例如需要访问最后三位元素:
>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> a[7:10]
[8, 9, 10]
现在,索引10指向的是第十一个元素,但是这个元素并不存在,却是在最后一个需要截取的元素之后。明白了吗?
可是,如果需要从列表的结尾开始计数呢?
>>> a[-3:-1]
[8, 9]
>>> a[-3:0]
[ ]
显然,这不是我们需要的结果,所以,如果我们需要分片中包含序列的结尾元素,只需置空最后一个索引即可:
>>> a[-3:]
[8, 9, 10]
那么,如果需要复制整个序列,那么,可以将两个索引都置空:
>>> a[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
二.更大的步长
在进行分片的时候,分片的开始和结束都需要指定。而另外一个参数——步长(step length)——通常都是隐式设置的。在普通分片中,步长是1——分片操作就是按照这个步长逐步遍历序列的元素,然后返回开始和结束点之间的所有元素。
>>> a[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
这个例子中,分片包含了另外一个数字,就是步长的显示设置。如果步长设置的比1大,那么就会跳过某些元素。例如步长为2的分片包括的是从开始到结束每隔一个的元素:
>>> a[0:10:2]
[1, 3, 5, 7, 9]
之前提到的捷径也可以使用:
>>> a[::4]
[1, 5, 9]
当然,步长不能为0(那不会执行),但是可以为负数,此时分片从右刀俎提取元素:
>>> a[::-2]
[10, 8, 6, 4, 2]
(3)序列相加
使用加运算符可以对序列经行链接操作:
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
>>> 'abc'+'efg'
'abcefg'
>>> [1,2,3]+['a','b','c']
[1, 2, 3, 'a', 'b', 'c']
>>> [1,2,3]+'asd'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
两种相同的序列才可以经行链接。
(4)乘法
用数字x乘一个序列会生成新的序列,而在新的序列中,原来的序列会被重复x次:
>>> 'hello '*5
'hello hello hello hello hello '
>>> [1,2]*5
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
None、空列表和初始化
空列表可以简单的通过[](两个中括号)表示,里面什么都没有。但是如果想创建一个占有十个元素的空间,但是里面什么也没有。这时候就需要一个值来代表空值。Python中使用None(注意None开头需要大写)来表示空值。None是Python的一个内建值。如果想初始化一个长度为10的空列表,可以这样:
>>> [None]*10
[None, None, None, None, None, None, None, None, None, None]
(5)成员资格
为了检查一个值是否在序列中,我们可以使用in运算符,并且返回一个bool值:
>>> a=[1,2,3,'a']
>>> 'a' in a
True
>>> 1 in a
True
下面为一个检查用户名/PIN码的例子:
database=[
['a','1'],
['b','2'],
['c','3']
]
username=raw_input('User name:')
pin=raw_input('pin:')
if [username,pin] in database:print 'ok'
输出为:
User name:b
pin:2
ok
(6)长度、最小值、最大值
内建函数len、max、min函数分别用来获取序列中的长度最小值和最大值:
>>> num=[100,5,36]
>>> len(num)
3
>>> max(num)
100
>>> min(num)
5
注意:min和max函数的参数并不是序列,而是多个数字直接为参数。
二.列表:Python的苦力
(1)list函数
list函数用来根据字符串创建列表:
>>> list('hello word')
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'd']
(2)列表的基本操作
1.改变列表:元素赋值
改变列表中的元素只需要根据索引找到相应元素直接赋值即可:
>>> x=[1,2,3]
>>> x[2]=7
>>> x
[1, 2, 7]
2.删除元素
删除元素也很简单,只需要用del语句删除就行:
>>> del x[2]
>>> x
[1, 2]
3.分片赋值
分片赋值功能非常强大,一次可以改变多个值,甚至可以使用和原序列不同长度的分片替换:
>>> name=list("Perl")
>>> name
['P', 'e', 'r', 'l']
>>> name[1:]=list('aaa')
>>> name
['P', 'a', 'a', 'a']
>>> name[1:]=list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
分片赋值可以实现插入操作:
>>> a=[1,5]
>>> a[1:1]=[2,3,4]
>>> a
[1, 2, 3, 4, 5]
类此,分片赋值还可以进行删除操作(把分片替换为空)
>>> a[1:4]=[]
>>> a
[1, 5]
(3)列表的方法
方法是一个与某对象有着密切联系的函数,对象可能是任何类型.一般来说方法可以这样调用:
对象.方法(参数)
后面将对方法进行更详细的解释。
1.append
append方法用户在队列末尾追加元素
>>> a=[1,2,3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
2.count
count方法用于统计列表中某个元素出现的次数:
>>> a=[1,1,2,3]
>>> a.count(1)
2
>>> a=[1,1,[1,[1,2]],2,3]
>>> a.count(1)
2
3.extend
extend方法可以在列表末尾一次性追加另外一个序列中的多个值:
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
4.index
index方法用于从列表中找出某一个值的第一个匹配项的索引:
>>> a=['we','are','the','one']
>>> a.index('the')
2
5.insert
insert方法用于将对象插入到列表中:
>>> a.insert(3,"not")
>>> a
['we', 'are', 'the', 'not', 'one']
6.pop
pop方法会移除列表中最后一个元素,并且返回该值:
>>> a=[1,2,3]
>>> a.pop()
3
>>> a
[1, 2]
注意:pop方法是唯一一个既能修改列表又能返回元素值(除了None)的列表方法。
7.remove
remove方法用于移除列表中某个元素的第一个匹配项:
>>> a=[1,2,3,1,]
>>> a.remove(1)
>>> a
[2, 3, 1]
8.reverse
reverse方法用于将列表中的元素反向存放:
>>> a=[1,2,3,4]
>>> a.reverse()
>>> a
[4, 3, 2, 1]
9.sort
sort方法用户改变原来的列表,并且让其按照一定的顺序排列,注意:方法本身无返回值,只改变这个列表本身。
>>> a=[2,1,5,4,3]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]
10.高级排序
如果希望元素能够按照特定的顺序排序,那么可以通过compare(x,y)的形式自定义比较函数。定义好函数后就可以提供给sort()方法作为参数了,内建函数cmp提供了比较函数的默认实现方式:
>>> a=[5,2,9,7]
>>> a.sort(cmp)
>>> a
[2, 5, 7, 9]
sort方法有另外两个可选的参数——key和reverse。如果要使用它们,就要通过名字来指定(这叫做关键字参数,以后会详细的讲到),参数key与参数cmp相似——必须提供一个在排序过程中使用的函数,然后,这个函数并不是直接确定对象的大小,而是为每个元素创建一个键,然后所有元素根据键来排序。例如,我们需要根据元素的长度来排序,可以使用len函数:
>>> a=['123','a','asdd']
>>> a.sort(key=len)
>>> a
['a', '123', 'asdd']
另外一个关键字reverse是用来指定元素是否需要进行反向排序:
>>> a=[2,3,1,4,6]
>>> a.sort(reverse=True)
>>> a
[6, 4, 3, 2, 1]
三.元组:不可变序列
元组和列表一样,也是一种序列。唯一的不同是元组不能修改,和字符串类似。创建元组很简单,如果你用逗号分隔了一些值,那么就自动创建了元组:
>>> a=1,2,3
>>> a
(1, 2, 3)
元组大部分时候是通过圆括号括起来的,空元组用一个空圆括号表示:
>>> a=()
>>> a
()
如果要实现一个值得元组,就在这个值后加逗号,即使逗号后为空:
>>> 4,
(4,)
tuple函数
tuple函数和list函数基本一样,以一个序列作为参数,返回它的元组:
>>> tuple("123")
('1', '2', '3')
元组的操作和列表的基本一样,元组的分片还是元组,就像列表的分片还是列表一样。