Python列表基础与进阶:增删改查及深浅拷贝详解
本文系统讲解Python中列表的核心操作。内容涵盖列表的定义与创建、元素的增删改查技巧,重点解析浅拷贝与深拷贝在包含可变对象时的区别,并介绍列表排序、反转、遍历及与其他数据结构的转换方法,帮助开发者掌握高效的数据处理技能。
Python列表基础概念
1. 列表
理解Python列表时,可将其与C语言中的数组进行类比记忆。两者在概念上具有相似性,但Python列表的定义方式更为直观,只需使用方括号包裹所需对象即可。Python列表功能强大,能够存储多种类型的数据,包括整型、浮点型、字符串以及自定义对象等。
与C++和Java不同,Python标准库中并未内置专门的数组类型,而是通常使用列表来模拟数组功能。相比之下,列表的使用方式更加灵活多变。
列表是Python中最基础的数据结构,其元素存储具有有序性,因此可以直接通过索引访问列表中的值。在学习数据结构时,我们知道对数据结构的操作主要包含增、删、改、查四个方面。接下来,文章将围绕这四个方面详细介绍列表的常用技巧。
列表的增删改查操作
1.1. 列表中的增
对列表的增加操作主要分为两种情况:一是创建一个新的列表,二是在现有列表中增加新元素。首先介绍如何创建新列表:
# 创建一个空列表
list1 = []
# 创建一个默认值为0,长度为n的列表
list2 = [0] * n
# 利用列表生成式创建列表
list3 = [i for i in range(10)]
# 5*5 二维列表
list4 = [[i for i in range(5)] for j in range(5)]
# 利用其他数据结构生成列表, list() 函数接收一个可迭代对象作为参数
tuple1 = (1, 2, 3)
list5 = list(tuple1)
# 字符串转化为列表
str1 = "I love code"
# 每个元素作为列表中的一个元素
list6 = list(str1)
# 按照指定字符分割
list7 = str1.split(" ") # ['I', 'love', 'code']
列表的拷贝:浅拷贝与深拷贝
在编程过程中,有时需要对列表进行操作,但列表属于可变对象,直接操作可能会改变其原有的顺序结构。因此,若希望保留原列表的顺序结构,需对旧列表进行拷贝后再对新列表进行操作。拷贝分为浅拷贝和深拷贝两种。有人可能会疑惑,这两种拷贝得到的列表形式是否相同?
是的,拷贝后得到的列表在形式上确实一致。但在实际操作中,尤其是当列表中包含可变对象时,两者会有显著差异。只需记住一点:浅拷贝仅复制不可变对象,而深拷贝不仅复制不可变对象,还会复制可变对象。以下通过示例说明:
# 如果一个列表中的元素都是不可变对象,可以直接用浅拷贝
list1 = [1, 2, 'i']
list2 = list1[::1] # 浅拷贝
list3 = [i for i in list1] # 浅拷贝
import copy
list4 = copy.copy(list1) # 浅拷贝
# 如果一个列表中的元素包含可变对象,要完成复制列表,需要用深拷贝
list5 = ["Will", 1, ["Python", "Java", "C++"]]
list6 = copy.deepcopy(list5)
为什么在包含不可变对象时,有时需要用到深拷贝呢?
前文提到,浅拷贝只拷贝不可变对象。当列表中存在可变对象时,可以发现其引用ID相同,即它们指向同一个对象,因此对list5的操作会影响list6。而在深拷贝中,对于可变对象,新列表中会生成一个新的对象,所以对list6的修改不会影响到list5。
id(list5[2]) # 2195936916360
id(list6[2]) # 2195936916744
对列表的另一种增加操作是在已有列表基础上增加元素,主要包括以下几种方式:
list1 = ["I"]
# 在列表尾部增加一个新元素
list1.append("love")
# 合并两个列表
list2 = ["Apple", 3]
list1.extend(list2) # ["I", "love", "Apple", 3]
list1 = list1 + list2 # ["I", "love", "Apple", 3]
# 在指定位置插入元素
list1.insert(index=1, "not") # ["I", "not", "love", "Apple", 3]
1.2. 列表中的删
数据结构的删除操作包括两种:删除整个列表,或删除列表中的某些元素。从内存中删除整个列表的操作十分简单:
list1 = [1, 2, 3]
del list1
对于删除列表中的元素,同样可以使用del语句,还可以使用remove()函数。
list1 = [1, 2, 3]
print(list1) # [1, 2, 3]
del list1[1]
print(list1) # [1, 3]
# 移除某个值的第一匹配项
list2 = [1, 2, 2, 3, 5]
list2.remove(2) # 移除第一个值为 2 的元素
1.3. 列表中的改
修改操作即在原有列表基础上进行变更。前文已介绍增加和删除操作,此处介绍不改变元素个数的操作,主要包括排序和反转列表等。
# 对一个整数列表进行排序
list1 = [9, 5, 6, 2, 7, 1, 3]
# 升序排列
list1.sort() # [1, 2, 3, 5, 6, 7, 9]
list1 = sorted(list1) # [1, 2, 3, 5, 6, 7, 9]
# 降序排列
list1.sort(reverse=True) # [9, 7, 6, 5, 3, 2, 1]
list1 = sorted(list1, reverse=True) # [9, 7, 6, 5, 3, 2, 1]
# 指定键值排序
list1 = [('a', 3), ('b', 2), ('c', 1)]
list1.sort(key=lambda x:x[1]) # [('c', 1), ('b', 2), ('a', 3)]
## 反转列表,即将原来的列表逆序排列
list2 = [4, 2, 3, 1]
list2 = list2[::-1] # [1, 3, 2, 4]
list2.reverse() # [1, 3, 2, 4]
1.4. 列表中的查
对列表的查找操作无外乎以下几种:
- 遍历列表;
- 查找指定索引的元素;
- 查找指定值的元素;
列表的遍历方式有三种,分别是根据索引遍历、根据值遍历和enumerate()遍历。
list1 = ["Python", "C++", "Java"]
# 方法 1
for i in range(len(list1)):
print(list1[i])
# 方法 2 , 遍历速度最高效,但是无法记录索引
for i in list1:
print(i)
# 方法 3
for index, val in enumerate(list1):
print(val)
查找元素有两种方式,一种是按照索引查找,另一种是遍历按值查找。
# 查找指定索引的元素
list1 = [1, 3, 2, 5, 7, 8]
list1[3] # 返回索引为 3 的元素,值为5
# 查找指定值的元素
key = 5
for i in list1:
if i == key:
print("OK")
# 查找最大元素和最小元素
max(list1) # 8
min(list1) # 1
列表的其他实用技巧
1.5. 其它小技巧
上述介绍了列表的增删改查四种常用操作,当然对列表的操作不仅仅只有这些,例如还有两个列表的比较,列表结构的转化等等。
比较两个列表是否是一样的,这里的前提条件是这两个列表对象不是同一个对象。
list5 = [("car", 1), ("bike", 2), ("foot", 3)]
list6 = [("car", 1), ("bike", 2), ("foot", 3)]
# 判断两个列表是否是同一个对象
list5 is list6 # False
# 判断两个列表是否相等
list5 == list6 # True
# 当列表中的元素很多,且结构复杂时,可以使用 numpy 模块
import numpy as np
a = np.array(list5)
b = np.array(list6)
(a == b).all() # True
列表结构的转化主要包括将列表转化为元组、集合、字符串和字典:
list1 = ["a", "b", "c", "d", "c"]
# 列表转化为元组
tuple1 = tuple(list1) # ('a', 'b', 'c', 'd', 'c')
# 列表转化为集合
set1 = set(list1) # {'a', 'b', 'c', 'd'}
# 列表转化为字符串
str1 = "".join(list1) # 'abcdc'
# 列表转化为字典,元素为 key, 次数为 value
from collections import Counter, defaultdict
dict1 = Counter(list1) # Counter({'a': 1, 'b': 1, 'c': 2, 'd': 1})
# 或者
dict2 = defaultdict(int)
for i in list1:
dict2[i] += 1
dict2 # defaultdict(int, {'a': 1, 'b': 1, 'c': 2, 'd': 1})
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









