必看!Python 列表高级技巧,助你编码实力“C 位出道”

B站影视 2025-01-12 20:00 3

摘要:列表是 Python 中最常用的数据结构之一,你可能已经熟悉 Python 列表的基础知识。但在本文中,我们将深入介绍可以使代码更高效、更具可读性的高级技术,会让你的编码技能提升到一个新的水平。

列表是 Python 中最常用的数据结构之一,你可能已经熟悉 Python 列表的基础知识。但在本文中,我们将深入介绍可以使代码更高效、更具可读性的高级技术,会让你的编码技能提升到一个新的水平。

列表推导式是一种易于阅读、紧凑且优雅的使用迭代对象创建列表的方式。通常格式是括在方括号中的单行代码。可以使用它来筛选、格式化、修改现有可迭代对象。

语法格式:

vals = [expression for value in collection if condition]

一个简单的列表推导式包含三部分,解释如下:

expression:输出结果for value in collection:数据集合if condition:条件

示例

>>> lst = [1,2,3,4,5,6,7,8,9,10]>>> a = [x*2 for x in lst if x > 4]>>> print(a)[10, 12, 14, 16, 18, 20]嵌套列表推导式

对于嵌套列表,将列表推导式提升到一个新的水平,使用嵌套列表推导式进行处理。不仅仅是对于嵌套的二维列表,甚至更深的嵌套。

示例

>>> lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> m = [i for x in lst for i in x if i % 2 ==0]>>> print(m)[2, 4, 6, 8]

zip 函数的作用是创建一个迭代器,该迭代器将聚合来自两个或多个可迭代对象的元素。可以同时遍历两个列表,也可以将多个列表“压缩” 在一起形成元组,反之,可以把压缩的列表解压。

示例

list1 = [1, 3, 5] list2 = ['a', 'b', 'c']for a, b in zip(list1, list2): print (a, b ,end=' ')# 输出:1 a 3 b 5 clist3 = list(zip(list1, list2))print(list3) # 输出:[(1, 'a'), (3, 'b'), (5, 'c')]lst1, lst2 = zip(*list3)print(list(lst1)) # 输出:[1, 3, 5]print(list(lst2)) # 输出:['a', 'b', 'c']

enumerate 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出元素数据和元素索引号,一般用在 for 循环当中。

citys = ["jinan", "qingdao", "zibo"]enumeratedCitys = enumerate(citys)print(list(enumeratedCitys))# 输出:[(0, 'jinan'), (1, 'qingdao'), (2, 'zibo')]for index,city in enumerate(citys): print(index,city)# 输出:# 0 jinan# 1 qingdao# 2 zibo

还可以指定索引的起始值。

citys = ["jinan", "qingdao", "zibo"]for index,city in enumerate(citys, start=1): print(index,city)# 输出:# 1 jinan# 2 qingdao# 3 zibo

列表切片是访问列表子集的一种强大方法。

基本语法为:

list[start:stop:step]

start:开始索引stop:结束索引step 变化量

特殊切片示例

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]slice1 = numbers[6:3:-1]slice2 = numbers[:6:-2]slice3 = numbers[6::-2] slice4 = numbers[5:]slice5 = numbers[:5]slice6 = numbers[-5:]slice7 = numbers[:-5]slice8 = numbers[::-1]print(slice1) # [6, 5, 4]print(slice2) # [9, 7]print(slice3) # [6, 4, 2, 0]print(slice4) # [5, 6, 7, 8, 9]print(slice5) # [0, 1, 2, 3, 4]print(slice6) # [5, 6, 7, 8, 9]print(slice7) # [0, 1, 2, 3, 4]print(slice8) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

“*”运算符可用于解包列表,可以实现合并列表或将列表作为参数传递给函数。

list1 = [1, 2, 3]list2 = [4, 5, 6]merged_list = [*list1, *list2]print(merged_list) # [1, 2, 3, 4, 5, 6] def multiplication(*args): m = 1 for i in args: m = m * i return mn1 = [1, 2, 3]print(multiplication(*n1)) # 6n2 = [7, 8, 9]print(multiplication(*n2)) # 504列表副本

可以使用赋值运算符 “=” 来创建列表的副本,你可能认为这会创建一个新列表,其实不然,它只创建一个共享引用原始列表的新变量。

对象拷贝时,不拷贝子对象的内容,只拷贝子对象的引用,子对象的修改直接影响源对象,可以称为浅拷贝。如果会连子对象的内存全部拷贝一份,对子对象的修改不会影响源对象,可以称为深拷贝。

使用 copy 模块演示浅拷贝和深拷贝的区别。copy 返回对象的浅拷贝,deepcopy 返回对象的深拷贝。

import copylist1 = [1, 2, 3,[ 4, 5, 6]]list2 = copy.copy(list1) # 浅拷贝list2[0] = 666print(list1) # [1, 2, 3, [4, 5, 6]]print(list2) # [666, 2, 3, [4, 5, 6]]list2[3][0] = 999print(list1) # [1, 2, 3, [999, 5, 6]]print(list2) # [666, 2, 3, [999, 5, 6]]list1 = [1, 2, 3,[ 4, 5, 6]]list2 = copy.deepcopy(list1) # 深拷贝list2[0] = 666print(list1) # [1, 2, 3, [4, 5, 6]]print(list2) # [666, 2, 3, [4, 5, 6]]list2[3][0] = 999print(list1) # [1, 2, 3, [4, 5, 6]]print(list2) # [666, 2, 3, [999, 5, 6]]

来源:信息科技云课堂

相关推荐