分享

第二章:列表和元组

 岚风窗 2015-05-28
       本章将引入一个新的概念:数据结构。数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构。在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号--即元素的位置,也称为索引。第一个索引是0,第二个则是1,以此类推。

一、序列概览
Python中包含6种内建的序列:字符串、Unicode字符串、buffer对象、xrange对象、列表和元组。本章重点讨论最常用的两种类型:列表和元组。
列表和元组都是内建序列,它们的主要区别是:列表可以修改,元组则不能。
序列(例如列表和元组)和映射(例如字典)是两类主要的容器。序列中的每个元素都有自己的编号、而映射中的每个元素则有一个名字(也称为键)。

二、通用序列操作
所有序列类型都可以进行某些特定的操作。包括索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,Python还有计算序列长度、找出最大元素和最小元素的内建函数。
1、索引
序列中的所有元素都是有编号的--从0开始递增。这些元素可以通过编号分别访问。


实例程序:输入年月日,然后打印出相应的月份名称。


2、分片
分片是通过冒号相隔的两个索引来实现,用来访问一定范围的元素。
一下是一些典型的示例:

获取正确的分片结果:开始点的元素(最左边元素)包括在结果之中,而结束点的元素(最右边的元素)则不在分片之内。当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。
附:偏移和分片的网格示意图:

3、序列相加
使用加号可以进行序列的连接操作,相当于合并。

但是列表和字符串是无法连接在一起的,尽管它们都是序列。只有相同类型的序列才能进行连接操作。


4、乘法
用数字x乘以一个序列会生成新的序列,而在新的序列中,原来的序列将被重复x次。


序列(字符串)乘法示例:以正确的宽度在居中的“盒子”内打印一个句子。

以上程序写在脚本里如下:

运行程序:

5、成员资格
为了检查一个值是否在序列中,可以使用in运算符。这个运算符检查某个条件是否为真,然后返回相应的值:条件为真则返回True,条件为假则返回False。这样的运算符叫做布尔运算符,而真值则叫做布尔值。



序列成员资格示例

以上程序写在脚本里如下:

运行程序:


6、长度、最小值和最大值
内建函数len、min和max非常有用。
len函数返回序列中所包含元素的数量,min函数和max函数则分别返回序列中最大和最小的元素。

三、列表
列表不同于元组和字符串的地方:列表是可变的(mutable),可以改变列表的内容,并且列表有很多有用的专门的方法。
1、list函数
因为字符串不能像列表一样被修改,所以有时候根据字符串创建列表会很有用。list函数就可以实现这个操作:

注:list函数适用于所有类型的序列,而不只是字符串。
2、基本的列表操作
1).改变列表:元素赋值
只要用普通的赋值语句就可以改变列表,如:

2).删除元素
从列表中删除元素用del语句来实现

3).分片赋值

分片赋值语句可以在不需要替换任何原有元素的情况下插入新的元素

语句中numbers[1:1]表示在1位置处插入新元素,而不去考虑1位置后面的元素。这相当于替换了一个空的分片,还可以替换过来:

3、列表方法
方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或者其它类型的对象,调用的格式如下:
对象.方法(参数)
1).append
在列表末尾追加新的对象


2).count
统计某个元素在列表中出现的次数

3).extend
extend方法可以在列表末尾一次性追加另一个序列中的多个值。换句话说,可以用新列表扩展原有的列表:

4).index
index方法用于从列表中找出某个值第一个匹配项的索引位置:

5).insert
insert方法用于将对象插入到列表中

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

7).remove
remove方法用于移除列表中某个值的第一个匹配值

8).reverse
reverse方法将列表中的元素反向存放

9).sort
sort方法用于在原位置对列表进行排序。这意味着改变原来的列表,从而让其中的元素能按一定的顺序排列,而不是简单地返回一个已排序的列表副本。

sort方法给x排好序后输出空值,所以这时候给x.sort()赋值的时候赋的是空值,如下:

当用户需要一个排好序的列表副本,同时又要保留原有列表不变的时候,可以用以下方法:

也可以用sorted函数

调用x[:]得到的是包含了x所有元素的分片,这是一种很有效率的复制整个列表的方法。而只是简单地把x赋值给y是没有的,因为这样就让x和y都指向同一个列表了。

10).高级排序
如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据Python的默认排序规则按升序排列元素),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x < y时返回负数,在x >y时返回正数,如果x = y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式。

sort方法有三种可选的参数--key、reverse和cmp
         


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

要实现一个值的元组得在值的后面加个逗号

1).tuple函数
tuple函数的功能与list函数基本上是一样的:以一个序列作为参数并把它转换为元组。如果参数就是元组,那么该参数原样返回:

2).基本元组操作

元组分片还是元组,就像列表分片还是列表一样。

本章小结
序列:序列是一种数据结构,它包含的元素都进行了编号(从0开始)。典型的序列包括列表、字符串和元组。其中列表是可变的(可以进行修改),而元组和字符串是不可变的(一旦创建就是固定的)。通过分片可以访问序列的一部分,其中分片需要两个索引号来指出分片的起始和结束位置。要想改变列表,则要对相应的位置进行赋值,或者使用赋值语句重写整个分片。
成员资格:in操作符可以检查一个值是否存在于序列(或者其它的容器)中。对字符串使用in操作符是一个特例--它可以查找子字符串。
方法:一些内建类型(例如列表和字符串,元组则不在其中)具有很多有用的方法。这些方法有些像函数--不过它们与特定值联系的更密切。

本章的新函数
  函数 描述
 cmp(x,y) 比较两个值
 len(seq) 返回序列的长度
 list(seq) 把序列转换成列表
 max(args) 返回序列或者参数集合中的最大值
 min(args) 返回序列或者参数集合中的最小值
 reversed(seq) 对序列进行反向迭代
 sorted(seq) 返回已排序的包含seq所有元素的列表
 tuple(seq) 把序列转换成元组




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多