python进阶(列表的高级特性)

前面我们学过了列表的一些简单的特性,本期我们介绍列表的高级操作:切片、内置函数、列表推导式。有了函数的基础,本期的知识相信大家就不难理解了。
切片 切片实际上是对列表进行截取的操作,它需要使用英文冒号,两边分别是起始的元素编号。
>>> list = [11, 22, 33, 44, 55]# 截取序号为1~3的元素,以列表的形式返回 >>> list[1:4] [22, 33, 44]# 截取序号为3到结束的所有元素,以列表的形式返回 >>> list[3:] [44, 55]# 截取序号为0~2的所有元素,以列表的形式返回 >>> list[:3] [11, 22, 33]# 不进行截取操作,返回完整的列表 >>> list[:] [11, 22, 33, 44, 55]# 可以用slilce()方法来获取特定的编号# 获取序号0~3,注意步长为2,表示每2个元素中取1个元素 # 实际上只获取到序号为0和2的元素 s1 = slice(0,4,2) >>> list[s1] [11, 33]# 步长的默认参数是1,默认参数在《函数2》中讲过 s2 = slice(0,4) >>> list[s2] [11, 22, 33, 44]

列表操作方法 python内置了一些处理列表的方法:
# 列表的各种操作方法示例:# 初始的列表 >>> list = [11, 22, 33, 44, 55]# 使用append()在列表尾部增加一个元素 >>> list .append(66) >>> print(list) [11, 22, 33, 44, 55, 66]# 使用extend()方法在列表尾部拼接另一个列表 >>> list.extend([55, 44, 33, 22, 11]) >>> print(list) [11, 22, 33, 44, 55, 66, 55, 44, 33, 22, 11]# 使用insert()方法在序号为6的位置插入一个元素77, # 原来序号大于等于6的元素,序号全部加1,低于6的元素不变 >>> list.insert(6, 77) >>> print(list) [11, 22, 33, 44, 55, 66, 77, 55, 44, 33, 22, 11]# 使用remove()方法删除第一个值为77的元素 >>> list.remove(77) >>> print(list) >>> print(list) [11, 22, 33, 44, 55, 66, 55, 44, 33, 22, 11]# 使用pop()方法删除列表中序号为5的元素,注意pop和remove的区别[1] >>> list.pop(5) >>> print(list) >>> print(list) [11, 22, 33, 44, 55, 55, 44, 33, 22, 11] # 直接使用list.pop(),默认删除最后一个元素, # 利用append()和pop()可以实现堆栈的push()和pop()的功能# 清除列表中的所有元素 >>> list.clear() >>> print(list) []list = [11, 22, 33, 44, 55, 66, 55, 44, 33, 22, 11] # 返回第一个值为44的元素的序号 >>> list.index(44) 3# 统计值为44的元素的个数 >>> list.count(44) 2# 为列表排序,从小到大, >>> list.sort() >>> print(list) [11, 11, 22, 22, 33, 33, 44, 44, 55, 55, 66] >>> list_2 = [2,21,223,'BCc','B', 'bc' ,'a'] >>> list_2.reverse() >>> print(list_2) ['a', 'bc', 'B', 'BCc', 223, 21, 2]# 将列表元素的顺序颠倒 >>> list.reverse() >>> print(list) [66, 55, 55, 44, 44, 33, 33, 22, 22, 11, 11]# 返回列表的浅复制 >>> list.copy() [66, 55, 55, 44, 44, 33, 33, 22, 22, 11, 11]

二维列表 python中是没有二维列表这个概念的,下面要说的二维列表本质上还是一维列表,只不过这个一维列表的元素都是一维列表。因此,一维列表的性质,二维列表都具备。之所以介绍二维列表,是因为某些情况下引入二维列表这个概念会使问题简化。
# 创建一个空二维列表 >>> list = [[]]# 二维列表的元素都是列表,想获取元素需要取两次索引 >>> list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> print(list[0]) [1, 2, 3] >>> print(list[0][0])

列表推导式 使用表达式来处理列表中的每一个元素,生成一个新的列表,这就是列表推导式[2]。前面我们在匿名函数的时候,就使用过列表推导式。
# 列表推导式的基本格式,if部分可以不用 [表达式 for 索引 in 列表 if 条件表达式]# 相当于下面的代码 result = [] for 索引 in 列表: if 条件表达式: result.append(表达式)# 简单的列表推导式示例 >>> list_1 = [11, 22, 33, 44, 55, 66] >>> list_2 = [i/11 for i in list_1] >>> print(list_2) [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]# 添加条件语句 >>> list_1 = [11, 22, 33, 44, 55, 66] >>> list_2 = [i/11 for i in list_1 if i%2==0] >>> print(list_2) [2.0, 4.0, 6.0]# 利用列表推导式,构建二维列表,其中每个元素都是0 >>> x, y = 3, 4 >>> list = [[0 for i in range(x)] for j in range(y)] >>> print(list) [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

聪哥看了《通过示例学习Python列表推导》[3]这篇文章之后,发现列表推导式的竟然还有这么多精彩的打开方式,感兴趣的同学可以看看。
总结
  1. 列表的重要功能是切片,可以截取某个列表中的任意一段作为列表
  2. python内置了许多用于处理列表的方法,大家需要活学活用
  3. 特定情况下,使用二维列表会简化编码
  4. 列表推导式可以简化代码,也体现了python简洁之美
思考
# 1.请编写一个函数,获取字符串中所有的数字, # 并将它们按照从大到小的顺序排列 # 2.请编写一个函数,找出一个列表中重复次数最多的数字 # 如果遇到次数相等的情况,则一并输出# 1. # 必须要引入re模块,否则不能使用compile方法 import re def get_numbers(string): # 利用re模块和正则表达式查找出所有的数字 pattern = re.compile(r'\d+') array = pattern.findall(string) # 按从小到大的顺序排序 array.sort() # 将顺序颠倒成从大到小 array.reverse() return array# 2. def search(array): # 使用set()方法返回一个集合,自动去除了重复元素 # list()方法将集合转化为列表 array1 = list(set(array)) # 获取array1中每个元素的重复次数,因此有:len(array1) == len(array2) array2 = [array.count(i) for i in array1] # 获取重复次数最大的元素 array3 = [array1[i] for i in range(len(array2)) if array2[i] == max(array2)] return array3# 上面利用了集合的概念,实现了去除列表中重复元素 # 没接触过集合的同学,可以使用以下代码实现同样的效果 array1 = [] for i in array: if i not in array1: array1.append(i)

参考资料
  1. 《Python对于列表的del, remove, pop操作的区别》原文链接:http://blog.csdn.net/lachesis999/article/details/53353745
  2. 《Python中的推导式使用详解》原文链接:http://www.jb51.net/article/67157.htm
  3. 《通过示例学习Python列表推导》:http://python.jobbole.com/80823/
扫一扫这个二维码,关注公众号:聪哥python,获取最新python3基础教程

python进阶(列表的高级特性)
文章图片
聪哥python 【python进阶(列表的高级特性)】

    推荐阅读