6.2.2 列表类型

6.2.2 列表类型

列表(list)是包含0个或多个对象引用的有序序列,与元组不同,列表的长度和内容都是可变的,可自由对列表中的数据项进行增加、删除或替换。列表没有长度限制,元素的类型可以各不相同,使用起来非常灵活。

1.创建列表

可以通过list()函数将已有的元组和字符串转换为列表,也可以直接用[]创建。

与整数和字符串不同,列表要处理一组数据,因此,列表必须通过显式的数据赋值才能生成,简单将一个列表赋值给另一个列表是不会生成新的列表对象的,而是两个变量指向同一个列表。只有通过list()或[]创建才会生成新列表。

如果非要将一个列表的值赋给另一个变量,可通过复制的方式实现。

2.列表操作

列表除了拥有序列类型的表6-1中12个通用操作符和函数之外,还包含一些自身特有的操作,具体见表6-2。

表6-2 列表常用的函数和方法

以上操作主要处理列表的增加、删除、修改等。

列表中元素的访问与操作:

利用列表的内置方法对元素进行操作:

下面介绍列表操作的应用。

【案例6-1】 生成随机验证码。

当前,很多网络应用都引入了验证码技术,以防止用户利用机器人自动注册、灌水、刷票、恶意破解密码等。验证码一般包含一串随机产生的数字或符号,以及一些干扰元素,如多条直线、若干原点、背景图片等。请利用随机函数和列表知识设计生成随机验证码,要求验证码有6个字符,字符只能是大写字母、小写字母或数字。

案例分析:

6位验证码功能需要随机生成6个字符,将6个字符存储到列表中,再通过遍历进行输出。实现思路如下。

第一步,导入随机函数库,创建空列表。

第二步,生成6个随机字符,逐个添加到列表中。随机字符只能是大写字母、小写字母及数字这3类,为确定在这3类数据中产生,可用一个1~3的随机整数来表示对应的状态,根据相应的值来决定产生什么,如“1”表示大写字母,“2”表示小写字母,“3”表示数字。字母可以根据ASCII码中相应的数值范围(大写字母为65~90,小写字母为97~122),用随机整数randint()来产生,再结合chr()函数将数值转换为字符。数字可用randint()直接在0~9的范围内随机产生。

第三步,按序拼接列表中的各字符,输出结果。

具体代码如下:

某次运行结果(每一次的运行结果都不一样)如下:

3.列表元素遍历

对列表进行遍历使用for-in结构,可对列表中元素按序进行访问。基本语法格式:

如果对元素进行访问不涉及删除操作,可直接遍历列表;如果对元素进行访问涉及删除或是元素位置变化的操作,则先对原列表进行复制,在复制的列表中遍历,在原列表中操作,这样可以保证每个元素都能被遍历到。下面通过几个案例来实践。

【案例6-2】 对列表元素求平均值。

已知一组数据[20,10,7,6,31],请求出这组数据的平均值。

案例分析:

对列表中的每个元素都进行访问,对它们的值进行累加,再将累加结果除以列表长度即可得到列表的平均值。在这个过程中,不需要改变元素的位置,可以直接对列表进行遍历。

运行结果:

对列表进行复制操作:ls.copy()。

【案例6-3】 删除3的倍数。

指定列表[23,45,78,87,11,67,89,13,243,56,67,311,431,111,141],请将其中所有3的倍数元素删除,并输出剩余的元素以及删除的个数。

案例分析:

在这个案例中需要对列表中的每个元素都进行访问,并判断该元素是否能被3整除,如果能被3整除,则删除元素。一旦涉及元素的删除,会导致列表的元素索引号发生改变,为保证每个元素都能被遍历到,需要先复制列表,在复制的列表中遍历,在原列表中删除。

运行结果: