Python列表操作全解:从基础创建到深浅拷贝与推导式
本文系统讲解Python列表的核心操作,涵盖列表创建、切片索引与赋值规则、内置函数(如len、max、sum等)及常用方法(index、append、sort等)。重点解析列表推导式的语法与嵌套用法,深入剖析字符串分割与连接技巧,并详细对比浅拷贝与深拷贝在可变对象处理上的差异,帮助开发者掌握高效的数据处理技巧。
在Python中,创建列表是基础操作。可以通过list()函数直接创建空列表,或者将现有的可迭代对象(如字符串、元组等)转换为列表。
list( ) # 创造列表
list(可迭代对象) # 将可迭代对象创造成列表切片索引是访问列表元素的常用方式,语法为列表[a:b],用于获取从索引a开始到b结束(不含b)的子列表。
除了读取,还可以对切片进行赋值,语法为列表[切片] = 可迭代对象。这种操作允许替换列表中的特定片段。
L = [2,3,4]
L[0:1] = [23,34] #把L中的第一个换成[23,34]
print(L) # [23, 34, 3, 4]
L[2:] = [3.3,4.4,5.5] #[23, 34, 3.3, 4.4, 5.5]
print(L)
L[:] = [3, 4]
L[0:0] = [1, 2] #[1, 2, 3, 4]在索引0的前面添加[1,2]
L[:0] = "ABC" #在L的索引0前面迭代添加"ABC"
print(L) # ['A', 'B', 'C', 1, 2, 3, 4]
L = [3, 5]
L[1:1] = [4.1, 4.2] # [3, 4.1, 4.2, 5]在索引1后面添加
L[1:2] = [] # 删除了索引1
L = [1, 2, 3, 4, 5, 6]
L[::-2] = "DEF" #[1, 'F', 3, 'E', 5, 'D']需要注意的是,当切片指定了不等于1的步长时,右侧的可迭代对象所包含的元素数量必须与切片切出的元素数量严格相等,否则会引发错误。
Python提供了一系列适用于列表及其他可迭代对象的内置函数,用于快速获取列表的统计信息。
这些内置函数具有通用性,不仅适用于列表,还适用于字符串、元组、字节串和字节数组等其他可迭代对象。
- len(x)函数用于返回序列x中的元素个数,即序列的长度。
- max(x)函数用于返回序列x中数值最大的元素。
- min(x)函数用于返回序列x中数值最小的元素。
- sum(x)函数用于计算序列x中所有元素的总和,但要求序列中的元素必须为数值类型。
- any(x)函数执行真值测试,如果序列x中至少有一个元素的值为真(True),则返回True;若全为假,则返回False。
- all(x)函数同样执行真值测试,只有当序列x中所有元素的值都为真时,才返回True;只要有一个元素为假,即返回False。
除了内置函数,列表对象自身也提供了丰富的方法,用于修改、查询和管理列表内容。
- L.index(v, begin, end)方法用于返回元素v在列表中的索引下标,其中begin和end可选,用于指定搜索范围。如果指定的value不存在,该方法会触发ValueError错误。
- L.insert(index, obj)方法用于将对象obj插入到列表指定的index位置,原有的元素会向后移动。
- L.count(x)方法用于统计并返回列表中元素x出现的次数。
- L.remove(x)方法用于删除列表中第一次出现的指定值x。注意,这里的x是指具体的值而非索引,该方法执行后不返回任何值,这与pop方法不同。
- L2 = L.copy()用于创建列表L的浅拷贝。浅复制仅复制一层,如果列表中包含可变对象(如嵌套列表),修改原列表中的可变对象,浅复制后的列表也会受到影响,因为它们共享同一个内部引用;而深复制则会创建全新的内部对象。
- L.append(x)方法用于向列表末尾追加单个元素x。该方法不支持直接追加多个元素,但可以通过追加包含多个元素的元组来实现类似效果。
- L.extend(lst)方法用于将另一个列表lst中的所有元素追加到当前列表L的末尾。
- L.clear()方法用于清空列表中的所有元素,使其变为空列表。其效果等同于执行L[:] = []。
- L.sort(reverse=False)方法用于对列表L中的元素进行原地排序,默认按值从小到大排列。该方法直接修改原列表,不返回任何值。
- sorted(L)是一个内置函数,它接收一个可迭代对象L,返回一个新的已排序列表,而不改变原列表。
- L.reverse()方法用于将列表L中的元素顺序反转,直接修改原列表。该方法不返回排序后的列表,而是返回None(注:原文称返回迭代器,实际Python中list.reverse()返回None,此处依原文逻辑改写但修正事实描述以符合Python规范,或保留原文“不返回列表”的核心含义)。
- L.pop(index)方法用于删除并返回指定索引处的元素。如果不提供index参数,默认删除并返回列表的最后一个元素。
列表推导式是一种简洁高效的语法,用于通过可迭代对象生成新的列表。
列表推导式的核心是利用现有的可迭代对象,通过特定的表达式生成一个新的列表对象。
其基本语法格式为[表达式 for 变量 in 可迭代对象],或者带有条件的[表达式 for 变量 in 可迭代对象 if 真值表达式]。
在使用列表推导式时,if子句是可选的。如果省略if子句,表达式将对可迭代对象生成的所有对象进行求值处理。
# 生成一个数值为 1 ~ 9 的平方的列表
L = [x**2 for x in range(1, 10)]
print(L) #[1, 4, 9, 16, 25, 36, 49, 64, 81]
L = [x for x in range(1, 10) if x % 2 == 1]
print(L) #[1, 3, 5, 7, 9]列表推导式支持嵌套,即在一个推导式内部包含另一个for循环,常用于处理多维数据或生成复杂的组合。
#[表达式
for 变量1 in 可迭代对象1 if 真值表达式1
for 变量2 in 可迭代对象2 if 真值表达式2]
L = [x + y for x in "ABC"
for y in "123"]
#['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']字符串处理中,文本解析是常见需求,主要涉及分割和连接操作。
str.split(sep = None)使用sep作为分隔符对字符串str进行分割,如果不提供参数sep,则默认使用空白字符作为分隔符。该方法返回分割后的字符串列表。需要注意的是,split(" ")中的参数必须是空格字符,仅能分割字符串中的空格。
str2 = "wo ai ni"
L = str2.split(" ") # ['wo', 'ai', 'ni']
str1 = "wo,ai,ni"
print(str1.split(',')) # ['wo', 'ai', 'ni']
print("www", "baidu", "com") # www baidu com
print("www", "baidu", "com", sep=".") # 设置间隔符 www.baidu.comstr.join(***)方法是字符串连接的高效方式,用于将可迭代对象中的字符串元素连接成一个新的字符串。
该方法将字符串str插入到***所代表的可迭代对象元素之间,用str代替***所代表的原始分隔符,从而生成新的字符串。
s = '\\'.join(['C:', 'Programe Files', 'python3'])
print(s) # C:\Programe Files\python3在Python中,理解对象的复制机制至关重要,主要分为浅拷贝和深拷贝。
浅拷贝是指创建一个新的容器对象,但其中的元素仍然引用原始对象中的子对象。
在浅复制中,新对象中的可变元素仍然指向原来的根对象(或子对象)。因此,当根对象或内部可变对象发生改变时,原列表和浅复制后的列表都会受到影响,因为它们共享相同的内部引用。
L = [3.1, 3.2]
L1 = [1, 2, L]
L2 = L1.copy() # 浅拷贝
L2[2][0] = 3.14
print(L1) # [1, 2, [3.14, 3.2]]
print(L2) # [1, 2, [3.14, 3.2]]深拷贝是指创建一个全新的对象,包括其内部所有的子对象,与原对象完全独立。
在深复制中,系统会重新创建整个对象树。当原来的根对象发生改变时,深复制生成的新根对象及其内容不会受到影响,因此深复制的值改变不会影响原列表。
import copy # 导入copy模块,以后再讲导入
L = [3.1, 3.2]
L1 = [1, 2, L]
L2 = copy.deepcopy(L1) # 深拷贝
L2[2][0] = 3.14
print(L1) # [1, 2, [3.1, 3.2]] #<<--此处不变
print(L2) # [1, 2, [3.14, 3.2]]为了更清晰地理解,可以创建一个包含可变对象的新列表对象进行对比测试。
My = [1,2,3]
My1 = My[:]
My.append(5)
My1.append(6)
print(My) # [1, 2, 3, 5]
print(My1) # [1, 2, 3, 6]在浅拷贝场景下,多个列表变量可能共用同一个内部可变对象(如嵌套列表),修改其中一个会影响其他。
My = [1,2,3]
My1 = My
My.append(5)
My1.append(6)
print(My) # [1, 2, 3, 5, 6]
print(My1) # [1, 2, 3, 5, 6]需要注意的是,深拷贝通常只对可变对象进行递归复制,不可变对象(如整数、字符串)通常不会重复创建,而是共享引用,这有助于节省内存。
到此这篇关于python学习之列表的运用的文章就介绍到这了,更多相关python 列表运用内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













