前面我们学过了列表的一些简单的特性,本期我们介绍列表的高级操作:切片、内置函数、列表推导式。有了函数的基础,本期的知识相信大家就不难理解了。
切片
切片实际上是对列表进行截取的操作,它需要使用英文冒号,两边分别是起始的元素编号。
>>> 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]这篇文章之后,发现列表推导式的竟然还有这么多精彩的打开方式,感兴趣的同学可以看看。
总结
- 列表的重要功能是切片,可以截取某个列表中的任意一段作为列表
- python内置了许多用于处理列表的方法,大家需要活学活用
- 特定情况下,使用二维列表会简化编码
- 列表推导式可以简化代码,也体现了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)
参考资料
- 《Python对于列表的del, remove, pop操作的区别》原文链接:http://blog.csdn.net/lachesis999/article/details/53353745
- 《Python中的推导式使用详解》原文链接:http://www.jb51.net/article/67157.htm
- 《通过示例学习Python列表推导》:http://python.jobbole.com/80823/
扫一扫这个二维码,关注公众号:聪哥python,获取最新python3基础教程