`
songzhan
  • 浏览: 239798 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

《Python基础教程》学习笔记 – Lesson02:列表和元组(转)

 
阅读更多

原文地址:

http://www.cnblogs.com/zero86/archive/2012/11/19/2776784.html

 

在Python中最基本的数据结构是序列(sequence),第一个索引从0开始;

 


 

在Python中,索引可以是负数,-1表示最后一个元素(倒数第一),-2表示倒数第二个元素;

 


 

例如:

 

01(50)

 

 

 

通用序列操作

 


 

索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying),判断某个元素是否属于该序列成员、此外,还有计算序列长度,找出最大或最小元素的内建函数;

 


 

索引

 


 

从 0 开始递增,例:

 

01(51)

 

如果索引是负数,则会从最右边开始,也就是从最后第一个元素开始计数,例:

 

01(52)

 

序列到 -5 的时候就是最后一个元素了(从右向左),等同于序列 0 ;

 

例:我们输入一个年份,只对最后 2 位感兴趣;

 

01(53)

 

这里使用 : 表示取一定范围的元素,2:4 表示获取第 3 个和第 4 个元素;

 

例:输入年月日,以月/日/年的英文+数字形式打印出日期;

 

代码:

 

01(54)

 

01-2(9)

 

运行结果:

 

02(7)

 

 

 

分片

 


 

可以使用分片操作( : )来访问一定范围内的元素,例:

 

01(55)

 

注意:分片操作,第一索引元素是包括其自身在分片内的,而第二个索引元素是不包括其自身在内的,类似数学上的半开区间 [a, b);

 

例:

 

01(56)

 

在分片操作中如果要取得最后一个元素,可以把第二个索引的最大值加一(以这个例子来说就是numbers[9,10]);

 

注意:如果分片中,左边的索引比右边出现的晚,结果就是一个空序,例:

 

01(57)

 

另外要取得的分片部分包括结尾元素,那么只需空置最后一个索引:
01(58)

 

这种方法同样适用于序列的开始以及整个序列:

 

01(59)

 

例,输入一个URL(假设形式为http://www.somedomainname.com),提取域名;

 

01(60)

 

 

 

步长

 

在进行分片的时候,默认步长(step length)是1,通常是隐式设置的,这里可以手动设置;步长可以为负数,那么它将会从右到左提取元素;

 

例:

 

01(61)

 

个人分析,其实就是设步长为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次;

 

例:

 

01(62)

 

如果要初始化一个空列表,可以使用Python内建值:None,例:

 

01(63)

 

例:读取用户输入的一条信息,然后再屏幕上横向居中显示一个矩形,矩形中间显示刚才输入的信息;

 

代码:

 

01(64)

 

运行结果:

 

01-1

 

这里的screen_width = 102 是我的屏幕宽度,矩形的宽度比文字宽度大6,每边多3个位置,用来排版的;

 

 

 

成员资格

 

为了检查一个值是否在序列中,可以使用in运算符,这个运算符检测某个条件是否为真,然后返回相应的值,例:

 

01(65)

 

最后是检查字符串,字符串最小的单位是字符,所以检测'$$'和空格都能查到(只要是连续的字符),但是查找'空格+!'是查不到的;

 

再看一个例子:查看输入的用户名和PIN号码是否存在数据列表中;

 

代码:

 

01(66)

 

运行结果:

 

01-1(1)

 

 

 

长度、最小值和最大值

 


 

len函数返回序列中包含元素的数量;

 

min和max函数分别返回序列中最大和最小的元素;

 

例:

 

01(67)

 

 

 

列表

 


 

list函数

 

因为字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用:

 

01(68)

 


 

基本的列表操作

 

 

 

  • 元素赋值

 

使用索引标记来为某个特定的元素赋值,例:

 

01(69)

 

 

 

  • 删除元素

 

使用del语句实现,例:

 

01(70)

 

 

 

  • 分片赋值

 

例:

 

01(71)

 

01-1(2)

 

numbers[1:1] = [2, 3, 4] 用来在索引1的位置插入几个数;

 

 

 

列表方法

 

 

 

  • append

 

用于在列表尾部追加新对象,例:

 

01(72)

 


 

  • count

 

统计某个元素在列表中出现的次数,例:

 

01(73)

 


 

  • extend

 

在列表末尾追加另一个序列中的多个值,例:

 

01(74)

 

extend和字符串连接符+的区别是,+并不会修改原来的某个列表,而是创建一个副本存储新列表,另外也可以使用a[len(a):] = b的方式扩展列表a,不过可读性不如使用extend函数;

 

 

 

  • index

 

用于找出某个值的第一个匹配索引位置,例:

 

01(75)

 

如果未找到,触发一个异常;

 

 

 

  • insert

 

将对象插入到列表中,例:

 

01(76)

 

insert方法不会替换原有数据,它可以在指定位置添加对象,insert的方法也可以用分片赋值来实现,不过可读性不强;

 

 

 

  • pop

 

该方法会移除列表中的一个元素(默认是最后一个),并且返回该元素的值,例:

 

01(77)

 

pop()方法会修改原有列表,pop()方法会移除一个元素;

 

使用pop可以实现常见的数据结构:栈,即:后进先出LIFO;在Python中没有所谓的入栈(push)方法,但是可以使用append方法来代替,例:

 

01(78)

 

如 果要实现先进后出(FIFO),可以使用insert(0,x)代替append方法,这里意思每次在序列最前端插入数据,每次pop()的数据就是最先 存入的数据;或者继续使用append,但必须使用pop(0)来代替pop(),这里的表示,依然使用append在列表后面添加数据,但是 pop(0)则是每次在列表最前端弹出数据,也就实现了最先存入的数据先被取出,例:

 

01(79)

 

不过最好的解决方案是使用collection模块中的deque对象;

 

 

 

  • remove

 

用于移除列表中某个值的第一个匹配项,例:

 

01(80)

 

值得注意的是,remove()是一个没有返回值的方法;

 

 

 

  • reverse

 

将列表中的元素反向存放,例:

 

01(81)

 

reverse()方法并不返回值,如果要对一个列表反向迭代(并不修改原来列表),可以使用reversed()函数,它返回一个迭代器(iterator)对象,然后使用list()函数可把返回的对象转换成列表;

 


 

  • sort

 

对列表进行排序,这个排序结果是直接保存在原列表的(2.3版以前不修改原序列,而是返回一个副本),例:

 

01(82)

 


 

如果要保存原来的列表,可以这样:

 

01(83)

 

不要执行类似如下的操作:

 

01(84)

 

sort()方法在2.3版本后直接修改原有列表,而且它并不返回值;

 

还要注意,不要使用y =  x,进行列表赋值,来保存原有列表,这是没用的,它实际会让他们指向同一个列表(地址),因为传递的是指针,例:

 

01(85)

 

另外,可以使用sorted()函数获取已排序的列表副本,例:

 

01(86)

 

它会返回一个已排序的列表,而不会去修改原有列表;

 

 

 

  • 高级排序

 

如果希望元素按照特定方式排序,可以通过compare(x, y)的形式自定义比较函数,compare(x, y)函数会在x > y时返回1,x < y时返回-1,x = y时返回0,内建函数cmp(),提供了比较函数的默认实现方式,例:

 

01(87)

 

关键字参数key,可以指定关键字进行排序,如果要按元素长度排序可以,可以指定key=len,例:

 

01(88)

 

int型不存在长度对比,他都是根据系统平台来说的:16/32位;

 

另一个关键字参数reverse是简单的布尔值,用来判断是否进行反向排序,例:

 

01(89)

 

 

 

元组:不可变序列

 


 

元组与列表一样,也是一种序列,唯一不同是元组不能修改(字符串也是如此),创建元组的语法很简单:如果用逗号分隔了一些值,那么就自动创建了元组,例:

 

01(90)

 

要创建一个元素的元组,可以逗号后面什么都不加,空元组直接写()即可,另外注意长度为1的元组和非元组的区别;

 

 

 

tuple函数

 


 

把一个序列转换为元组,类似list()把序列转换为列表,如果参数就是元组,那么就会被原样返回,例:

 

01(91)

 

元组也可以进行分片操作;

 

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics