第二章 列表和元组
【数据结构】是通过某种方式(例如对元素进行编号)组织在一起的【数据元素的集合】,这些数据元素可以是数字或者字符,甚至可以是其他的数据结构。
在python中,最基本的数据结构是【序列】。
序列中的每个元素被分配一个序号——即元素的位置,也称为【索引】。
p.s.概念介绍完之后再往下看就会忘掉,为了防止这种情况,我会在这些概念后面用括号把概念的意思标注出来,直到熟悉到不需要了为止。
2.1序列概览
Python中包含六种内建的序列(最基本的数据结构),本章重点讨论两种:【列表】和【元组】,其他的内建序列(最基本的数据结构)有【字符串】、【Unicode字符串】、【buffer对象】、【xrange对象】。
图1.六种内建序列。
列表和元组的区别在于,列表(序列的一种)可以修改,元组(序列的一种)不能修改。
在需要操作一组数值的时候,序列很好用。
例:用序列表示数据库中一个人的信息,第一个元素是姓名,第二个元素是年龄。
图2.根据上述内容编写的【列表】,各个元素通过逗号分隔,写在方括号中。
序列也可以包含其他序列。
图3.构建一个人员信息列表:database。
序列中每一个元素都有自己的编号,即【索引】。
图4.根据序号查询database中的信息。
p.s.python还有一种名为容器的数据结构。容器是包含其他对象的任意对象。序列(列表和元组)和映射(字典)是两类主要的容器(数据结构)。
2.2通用序列操作
所有序列(最基本的数据结构)类型都可以进行某些特定的操作。
图5.六种通用序列操作。
2.2.1索引
序列中的所有元素都是有编号的,从0开始递增。
所有序列都可以通过这种方式进行索引。
使用负数时,python会从最右边开始计数最后一个元素的编号是-1。
以上内容见图4。
字符串字面值能够直接使用索引,而不需要一个变量引用它们。
图6.以上两种方法效果一样。
如果一个函数调用返回一个序列,那么可以直接对返回结构进行索引操作。
例:如果只对用户输入年份的额最后一位感兴趣,那么可以进行如下操作。
图7.有索引和没有的区别。
代码清单2-1 索引示例
# -*- coding: utf-8 -*-
#代码清单2.1 索引示例
#根据给定的年月日以数字形式打印出日期
months=['January','February','March','April','May','June','July','August','September','October','November','December']
#以1~31的数字作为结尾的列表
endings=['st','nd','rd']+17*['th']\
+['st','nd','rd']+7*['th']\
+['st']
year=raw_input('Year:')
month=raw_input('Month(1-12):')
day=raw_input('Day(1-31):')
month_number=int(month)
day_number=int(day)
#记得要将月份和天数减1,以获得正确的索引
month_name=months[month_number-1]
ordinal=day+endings[day_number-1]
print month_name+' '+ordinal+' '+year
2.2.2分片
分片操作访问一定范围内的元素。
分片通过冒号隔开两个索引来实现。
图9.分片示例1。
图10.分片示例2。
第1个索引的元素包含再分片内,第2个不包含在分片内。
1.优雅的捷径
例:假设需要访问最后3个元素,那么可以进行显式操作。
图11.访问最后3个元素,第二个索引值可以是不存在的元素。
例:如果想要从列表的结尾开始计数。
图12.从结尾开始计数,第二个索引值置空。
图13.其他索引用法。
总结:
1.访问后n个元素,第二个值可以置空。
2.访问后n个元素,第二个值可以是不存在的值。
3.访问前n个元素,第一个值可以置空。
4.复制整个序列,两个值都置空。
代码清单2-2 分片示例
# -*- coding: utf-8 -*-
#对http://www.something.com形式的URL进行分割
url=raw_input('Please enter the URL:')
domain=url[11:-4]
print "Domain name:"+domain
2.更大的步长
进行分片的时候,除了开始和结束的点需要指定,还有一个参数是隐式的,那就是步长。
图15.步长不能取0。
图16.步长取负数的时候,开始的值和结束的值互换。
总结:
1.步长不能为0。
2.步长可以为负数,此时从右到左提取元素。
2.2.3序列相加
列表和字符串是无法连接到一起的,尽管他们都是序列。
两种同类型的序列才能进行连接操作。
图17.序列相加。
2.2.4乘法
图18.字符串和列表的乘法。
None、空列表和初始化
图19.[ ]和[None]。
空列表可以简单地通过两个括号进行表示。
None是Python的一个内建值,表示什么都没有,利用None可以初始化一个只有长度没有内容的列表。
代码清单2-3 序列(字符串)乘法示例
#以正确的宽度在居中的“盒子”里打印一个句子
#注意,整数除法运算符(//)只能用在Python2.2以及后续版本,在之前的版本中,只使用普通除法(/)
sentence=raw_input("Sentence:")
screen_width=80
text_width=len(sentence)
box_width=text_width+6
left_margin=(screen_width-box_width)//2
print
print ' '*left_margin+"+" +"-"*(box_width-2)+"+"
print ' '*(left_margin+2)+"|"+" "*text_width +"|"
print ' '*(left_margin+2)+"|"+ sentence +"|"
print ' '*(left_margin+2)+"|"+" "*text_width +"|"
print ' '*left_margin+"+" +"-"*(box_width-2)+"+"
2.2.5成员资格
为了检查一个成员是否在序列中,可以使用in运算符。
图21.字符串成员资格。
图22.序列成员资格。
代码清单2-4 序列成员资格示例
#检查用户名和PIN码
database=[['albert','1234'],['dilbert','4242'],['smith','7524'],['jones','9843']]
username=raw_input("User name:")
pin=raw_input("PIN code:")
if[username,pin]in database:print 'Access granted'
if[username,pin]not in database:print 'Error'
2.2.6长度、最小值和最大值
图24.长度、最小值和最大值的若干示例。