原文地址:
http://www.cnblogs.com/zero86/archive/2012/11/19/2776784.html
在Python中最基本的数据结构是序列(sequence),第一个索引从0开始;
在Python中,索引可以是负数,-1表示最后一个元素(倒数第一),-2表示倒数第二个元素;
例如:
通用序列操作
索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying),判断某个元素是否属于该序列成员、此外,还有计算序列长度,找出最大或最小元素的内建函数;
索引
从 0 开始递增,例:
如果索引是负数,则会从最右边开始,也就是从最后第一个元素开始计数,例:
序列到 -5 的时候就是最后一个元素了(从右向左),等同于序列 0 ;
例:我们输入一个年份,只对最后 2 位感兴趣;
这里使用 : 表示取一定范围的元素,2:4 表示获取第 3 个和第 4 个元素;
例:输入年月日,以月/日/年的英文+数字形式打印出日期;
代码:
运行结果:
分片
可以使用分片操作( : )来访问一定范围内的元素,例:
注意:分片操作,第一索引元素是包括其自身在分片内的,而第二个索引元素是不包括其自身在内的,类似数学上的半开区间 [a, b);
例:
在分片操作中如果要取得最后一个元素,可以把第二个索引的最大值加一(以这个例子来说就是numbers[9,10]);
注意:如果分片中,左边的索引比右边出现的晚,结果就是一个空序,例:
另外要取得的分片部分包括结尾元素,那么只需空置最后一个索引:
这种方法同样适用于序列的开始以及整个序列:
例,输入一个URL(假设形式为http://www.somedomainname.com),提取域名;
步长
在进行分片的时候,默认步长(step length)是1,通常是隐式设置的,这里可以手动设置;步长可以为负数,那么它将会从右到左提取元素;
例:
个人分析,其实就是设步长为n,分片起始地索引为f,分片结束索引为l,目前正在执行的索引序列为t,那么它的执行过程就是:
如果n为正值(伪代码):
loop p1:
t = f;
if t < l then
(print numbers[t]);
t = t + n;
else goto ...
goto p1
如果n为负值(伪代码):
loop p1:
t = f;
if t > l then
(print numbers[t]);
t = t + n;
else goto ...
goto p1
序列的相加和乘法
通过使用加号可以进行数列的连接操作:
用过数字x乘以一个序列,会产生一个新序列,原来的序列将被重复x次;
例:
如果要初始化一个空列表,可以使用Python内建值:None,例:
例:读取用户输入的一条信息,然后再屏幕上横向居中显示一个矩形,矩形中间显示刚才输入的信息;
代码:
运行结果:
这里的screen_width = 102 是我的屏幕宽度,矩形的宽度比文字宽度大6,每边多3个位置,用来排版的;
成员资格
为了检查一个值是否在序列中,可以使用in运算符,这个运算符检测某个条件是否为真,然后返回相应的值,例:
最后是检查字符串,字符串最小的单位是字符,所以检测'$$'和空格都能查到(只要是连续的字符),但是查找'空格+!'是查不到的;
再看一个例子:查看输入的用户名和PIN号码是否存在数据列表中;
代码:
运行结果:
长度、最小值和最大值
len函数返回序列中包含元素的数量;
min和max函数分别返回序列中最大和最小的元素;
例:
列表
list函数
因为字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用:
基本的列表操作
- 元素赋值
使用索引标记来为某个特定的元素赋值,例:
- 删除元素
使用del语句实现,例:
- 分片赋值
例:
numbers[1:1] = [2, 3, 4] 用来在索引1的位置插入几个数;
列表方法
- append
用于在列表尾部追加新对象,例:
- count
统计某个元素在列表中出现的次数,例:
- extend
在列表末尾追加另一个序列中的多个值,例:
extend和字符串连接符+的区别是,+并不会修改原来的某个列表,而是创建一个副本存储新列表,另外也可以使用a[len(a):] = b的方式扩展列表a,不过可读性不如使用extend函数;
- index
用于找出某个值的第一个匹配索引位置,例:
如果未找到,触发一个异常;
- insert
将对象插入到列表中,例:
insert方法不会替换原有数据,它可以在指定位置添加对象,insert的方法也可以用分片赋值来实现,不过可读性不强;
- pop
该方法会移除列表中的一个元素(默认是最后一个),并且返回该元素的值,例:
pop()方法会修改原有列表,pop()方法会移除一个元素;
使用pop可以实现常见的数据结构:栈,即:后进先出LIFO;在Python中没有所谓的入栈(push)方法,但是可以使用append方法来代替,例:
如 果要实现先进后出(FIFO),可以使用insert(0,x)代替append方法,这里意思每次在序列最前端插入数据,每次pop()的数据就是最先 存入的数据;或者继续使用append,但必须使用pop(0)来代替pop(),这里的表示,依然使用append在列表后面添加数据,但是 pop(0)则是每次在列表最前端弹出数据,也就实现了最先存入的数据先被取出,例:
不过最好的解决方案是使用collection模块中的deque对象;
- remove
用于移除列表中某个值的第一个匹配项,例:
值得注意的是,remove()是一个没有返回值的方法;
- reverse
将列表中的元素反向存放,例:
reverse()方法并不返回值,如果要对一个列表反向迭代(并不修改原来列表),可以使用reversed()函数,它返回一个迭代器(iterator)对象,然后使用list()函数可把返回的对象转换成列表;
- sort
对列表进行排序,这个排序结果是直接保存在原列表的(2.3版以前不修改原序列,而是返回一个副本),例:
如果要保存原来的列表,可以这样:
不要执行类似如下的操作:
sort()方法在2.3版本后直接修改原有列表,而且它并不返回值;
还要注意,不要使用y = x,进行列表赋值,来保存原有列表,这是没用的,它实际会让他们指向同一个列表(地址),因为传递的是指针,例:
另外,可以使用sorted()函数获取已排序的列表副本,例:
它会返回一个已排序的列表,而不会去修改原有列表;
- 高级排序
如果希望元素按照特定方式排序,可以通过compare(x, y)的形式自定义比较函数,compare(x, y)函数会在x > y时返回1,x < y时返回-1,x = y时返回0,内建函数cmp(),提供了比较函数的默认实现方式,例:
关键字参数key,可以指定关键字进行排序,如果要按元素长度排序可以,可以指定key=len,例:
int型不存在长度对比,他都是根据系统平台来说的:16/32位;
另一个关键字参数reverse是简单的布尔值,用来判断是否进行反向排序,例:
元组:不可变序列
元组与列表一样,也是一种序列,唯一不同是元组不能修改(字符串也是如此),创建元组的语法很简单:如果用逗号分隔了一些值,那么就自动创建了元组,例:
要创建一个元素的元组,可以逗号后面什么都不加,空元组直接写()即可,另外注意长度为1的元组和非元组的区别;
tuple函数
把一个序列转换为元组,类似list()把序列转换为列表,如果参数就是元组,那么就会被原样返回,例:
元组也可以进行分片操作;