python 3数据结构列表
列表是按顺序排列的数据集合。
因为能将单个数据组合起来,方便集中访问和管理,列表在所有编程语言中都是一种非常重要的数据结构。下面,我们简单介绍一下列表的创建、访问、添加、删除、索引、选取、复制等操作。
创建列表
在 Python 中,列表用方括号 [] 、list()函数以及列表推导的方式来定义。
方括号的方式是最简单、最常用的方式。
上面我们使用方括号定义了三个列表。可以看出,列表既可以存储同一类型的数据,也可以存储不同类型的数据。事实上,列表中的元素可以是任何合法的 Python 对象,包括列表自身,就是说,可以创建包含列表的列表。
有时我们可能不想从头创建一个列表,而是利用已有的数据产生一个列表,这时候 list() 函数就配上用场了,其可以将其它数据结构转换为列表。
如果需要创建的是数值型列表,且有一定的规律,比如等差数列,可以用先用 range() 函数产生一个序列,然后用 list() 函数将其转换为列表。
还有一种更加灵活的列表创建方式,即通过解析或者推导的方式产生列表。
在上面的例子中,我们在方括号 [] 里定义了给一个表达式,用于生成列表项的值。其含义很直观,就是用 1...5 的值当做半径计算圆的面积,实际上这个表达式是 for 表达式的变种,后面不加冒号且,计算值的表达式 round r r,2) 在 for 之前。 im 是引入了 math 模块,以便使用圆周率常数。
访问元素
列表是按照顺序排列的,我们可以用元素在列表中的位置来访问。和绝大部分编程语言一样,Python 的位置(下标、索引)是从 0 开始的,就是说,第一个元素的下标是 0 而不是 1。因此最大的下标数是元素个数减1。若超出最大下标范围, Python 会抛出IndexError。
修改、添加、移除元素
修改元素非常简单和直观,直接通过下标赋值即可。当然,同上面一样,列表的下标必须在范围内,否则会抛出 IndexError。
若想在列表的尾部追加元素,可以使用列表的 append() 方法。
append() 方法不够灵活,只能在尾部添加元素。若想在指定位置添加元素,可以使用 insert() 方法。
从列表中移除元素有两种方式,一种是直接移除,不返回被移除的元素,用 Python 语句 del 实现。一种是从给列表中移除元素并返回被移除的值,用列表的方法 pop() 实现。
查询、索引元素
可以通过 index() 方法获取指定元素在列表中第一次出现的位置,若列表中不存在该元素,则抛出 ValueError。
在上面的例子中,我们若用index() 查询列表中不存在的值。这种情况,有两种办法可以应对,一是异常处理,这是一种事后的补救,二是首先判断列表中有没有这个值,然后再获取索引,这是一种更加积极的事前预防策略。
判断一个值是否在列表中最简单的方法有两种。一是 in 语句,是一种典型的 Python 风格语句。二是列表的 count() 函数,若 count 函数返回的值为0,则没有该值,这是典型的面向对象的方法,我个人更喜欢第二种。
前面我们介绍过从列表中移除元素的方法,只介绍了 del 语句 和 pop() 方法。实际上,还可以直接从列表中移除具有指定值的元素。之所以前面没介绍,是因为效果是先找到该元素的索引,再用 del 或者 pop() 移除。
过滤、选取、复制列表
从一大堆数据中选取符合条件的数据,是非常常用的功能需求。在 Python 中,可以用下标表达式来选取列表中的元素,其格式为 起始元素: 结束元素,若省略起始元素,则默认为从 0 开始;若省略结束元素,则默认为直到列表尾部。反悔的结果中不包含结束元素本身,即选取范围为 其实元素到结束元素的前一个元素。
看到这儿,有很多同学可能要问了,[:]有啥意义呢,我直接使用原列表不就行了吗。其实这个事是这样的,使用下标从列表中选取数据,每次实际上是返回了一个新的列表,那么 [:] 相当于复制了整个列表。
可见 names1 和 names 已经不是同一个列表。因此,我们可以简单的用 [:] 复制列表,获取一个当前列表的备份。实际上,复制列表的方法还有两种,如下所示:
可以看出,至少有三种方法来复制列表,都可以达到效果。但笔者只推荐 copy() 方法。因为编程一个良好的实践就是简单、减少副作用。事实上,[:] 最主要的作用就是选取元素,list() 函数最主要的作用就是将其它数据结构转换为列表,负值列表只是其副作用。只有 copy() 完全是为复制元素定制的,因此用 copy() 方法语义会更加清晰、简单,可阅读性更强。
遍历列表
经常会需要遍历访问列表,对列表中的所有元素进行一定的操作。在 Python 中,可以使用 for 语句遍历访问列表。
这里需要提醒的是, Python 完全靠缩进来判断代码之间的关系。而绝大部分编程语言用花括号 {} 来组织,因此若从其它语言转过来学 Python的,可能有些不适应。