第五课 列表、元组与字符串

来源:互联网 发布:安卓内存优化工具 编辑:程序博客网 时间:2024/06/05 00:29

通过一个“人员信息统计表”学习列表、元组与字符串的用法

 

列表,是编程常用的工具,作用是用来处理大量数据;

元组,是Python的特别设置,用来做“常量集合”;

字符串,是编程时经常要处理的内容

 

1、        声明列表

2、        列表元素的使用

3、        列表中元素的添加,插入,删除,修改

4、        元组的声明和元组元素的使用

5、        切片运算

6、        字符串的声明

7、        字符串的连接、格式化、转换、分割

 

 

 第一个例程就争取不寻常,它说明list是一个集合,仅仅是个集合,而不是象其它语言的数组是“同类型数据的集合”,对,list可以使用不同类型,请看案例5-1:



运行结果是:





学一下验证自己想法的方法,Python可以快速得到答案,所以可以快速验证,list中可以放置不同类型的元素?try it,第一行正确执行,OK。

第2行和第3行是测试一下是否可以按元素下标(或叫索引)使用列表元素?对照输出的结果,完全没有问题,第4、5行的用意是测试一下list中的元素是否可以按数据原有的类型计算(它不会把所有数据都转化成一种通用类型吧)?通过测试结果看,直接将字符串和数值类型数据分别计算结果十分正常。故list这种集合比传统数组要方便多了。另外,我们利用列表名[索引]的方法使用列表中的元素。同时注意元素索引的的最小值是0,那么若列表中有N个元素,最大索引就是N-1。

当然,若在列表中存放相同类型的元素,那是完全可以的。

下面来一个复杂应用吧,对编程来说,不禁止,即允许,所以不要束缚自己的想象力。

 

 

 

 

 

例5-2的第1行定义了一个列表,但是这个列表有两个元素,每一个元素都是一个列表,而且连个列表的组织方式也不一样,其中lst00[0]中有5个字符串,分别是lst[0][0]:“sn”,lst[0][1] :“home”,lst[0][2] : “name”,lst[0][3] : “score_1”,lst[0][4] : “score_2”,lst[1]包含三个数字,两个字符串每个元素分别如下:

lst[1][0]:12、lst[1][1]:’beijing’、lst[1][2]:’zhang3’、lst[1][3]:83.5、lst[1][4]:89

 

明白了吧:对于lst00而言,有2个元素:lst00[0]和lst00[1],但是由于lst00[0]和lst00[1]又都是列表,所以,lst00[0]这个列表的第一个元素是lst[0][0],第I 个元素是lst[0][i]。本案例将lst[0]当作表头,将lst[1]用作人员信息。

第7行示意了一个简洁的遍历列表元素的方法:for  “变量”  in 列表,它的含义是:依次用列表元素向“变量”赋值,直到穷尽列表元素。它比计算出列表长度SIZE,在用0到SIZE-1的下标去遍历要简洁方便。要注意的是“变量”的类型要与列表中元素的类型一致。

第7行到第19行演示了用循环遍历和用“下标引用”两种方法使用列表。

 

本节的案例就是利用列表、元组和字符串的各种内置方法完成一个人员信息管理程序。案例5-3演示了利用列表的内置函数对人员信息进行各种操作,从案例5-3开始,一些简单的注释就放在程序中了,为此程序需要支持UTF字符。

 

第一个案例就提到过,在程序的第一行标注“# -*- coding: utf-8 -*-”就可以在程序中使用中文字符串和中文注释。

现在看一下5-3的第一部分程序:

 

 

 

这个程序在24行之前,打印了所有的列表元素,其中第15行的目的是遍历lis00列表的lst00[1]到lst00[len_msg]的所有元素,而25行对lst00的列表尾部加入1条记录,25行以后的代码又将列表中所有元素都打印了一遍。可以看到新加入的人员信息在最后一行。

 

 

 

 

只是这个程序的打印部分应该被定义为函数,这样不但能使程序可读性增强,还能有效缩短代码长度。所以修改5-3,并加入其他功能。

首先看一下提取出来的函数(工具包:list_5.py):

 



那么要完成案例5-2的功能就可以变得非常简单了:

 

         # -*- coding: utf-8 -*-  此行的目的是使用中文

         from list_5 import *

         print_lst()

          print '\n现在插入一条记录z在列表尾部,然后打印'

          lst00.append([12,'东城','李四',87.5,86])

          print_lst() 

 

现在这个程序比较容易看懂了吧,源代码不要求通俗,但一定要易懂。

虽然在新的案例5-2代码中没有声明列表lst00,但是第2行的from  import引入的list_5中进行了定义。

现在是综合案例的5-3:

 



 

接下来再研究元组的案例,元组是个有意思的集合,它是一个元素(直接元素)不可更改的集合,无论是元素值、元素数量都不可更改。

列表用[]定义,元组用()定义,例如

math_const_value=(3.1415,2.71828),元组math_const_value中包含了圆周率和自然对数的底两个常数,使用中若试图改变元组中的这两个数,程序会出现错误。

但是,元组中的元素可以是列表,列表的元素可以改变,所以“元组是直接元素不可改变的集合”,这句话看得懂就可以将这个机制用在C语言指针数组那种情境中,若看不懂,那就说明你不需要看懂。 

 

元组和列表最突出的区别就是“元组一旦定义即不可更改”,而在访问元素的方法方面都是类似的。

下面用几个片断展示一下Python的 “切片运算”,切片的含义是从一个集合中挑选出需要的子集,切片运算适用于列表、元组和字符串,下面的案例混合使用元组、列表和字符串。

设有列表 list_demo[4]=[‘a’,’b’,’c’,’d’]

        tuple_demo[5]=[1,2,3,4,5,6,7,8,9]

1)使用缺省风格的下标:

   引用前三个元素:print  tuple_demo[:3]

 

2)使用“倒数第N个元素”风格的下标

引用倒数三个元素:print  list_demo[-3:-1]

负数的含义是倒数…

 

3)还可以在引用中使用两个冒号,形如“L: M:N”,表达从L开始到M,每隔N个元素取值。

从第2个元素到 倒数第1个元素,每隔2个元素打印:

print tup[2:-1:2]

 

4)从匿名集合中切片

可以从一个匿名的集合切片:

print (2,4,6,8,10)[::2],注意第一个冒号两边都是空的,空的含义是total,所以结果是(2,6,10)

 

匿名的优势在于可以将一个集合运算的结果嵌入新的运算表达式。

 

观察以上案例的结果应该发现,列表和元组的计算结果任然是列表和元组。

 

 

5)匿名集合切片的机制的一个大好处是处理字符串,这样处理字符串也可以用表达式了级别的运算了。

从“beijing”中取出前三个字符

print “Beijing”[:3]

 

 

 

Python 的字符串操作十分简单,这里介绍几个有特色的,读一遍代码即可,很好理解。

1)        替换

print “AAABBBAAA”.replace(“BBB”,”AAA” )

>>> AAAAAAAAA

 

 

2)        比较

 

>>> cmp("beiping","beijing")

1

>>> cmp("beijing","beijing")

0

>>> cmp("beijing","beiping")

-1

 

 

3)        查找

print “china beijing”.find(“bei”)

>>>6

这表示“bei”在“china beijing”中的第6个字符开始的地方被找到

 

 

4)        大小写转换

stru=“beijing”upper()

print stru

strl=stru.lower()

print strl

 

5 去掉空格

 

 

>>> "  china,beijing,chaoyang  ".strip()

'china,beijing,chaoyang'

>>> "  china,beijing,chaoyang  ".lstrip()

'china,beijing,chaoyang   '

>>> "  china,beijing,chaoyang  ".rstrip()

'  china,beijing,chaoyang'

注意strip,lstrip和rstrip的区别是分别去掉“左、右和两边”的空格

 

6)  分割是编程中常用的技巧

 

>>> "china,beijing,chaoyang".split(",")

['china', 'beijing', 'chaoyang']

 

从例句可以看到,字符串用split(‘分割标志字符’)来将字符串分割成若干部分,分割结果放入列表,然后可以使用列表的处理方法引用各部分


0 0