1. List的定义和基本操作
在Python中,List是一种非常常用的数据类型,它是一串按照特定顺序排列的值的集合,可以存储任意数据类型的元素,包括数字、字符串、甚至其他List和Tuple。
定义一个List,可以使用方括号括起来,多个元素之间用逗号进行分隔:
my_list = [1, 2, "hello", 3.14]
可以通过下标访问List中的元素,注意下标从0开始:
my_list = [1, 2, "hello", 3.14]
# 访问第一个元素
print(my_list[0]) # 结果为 1
# 访问第三个元素
print(my_list[2]) # 结果为 "hello"
当访问越界的下标时,会抛出IndexError异常,需要注意:
my_list = [1, 2, "hello", 3.14]
# 访问越界的下标
print(my_list[4]) # 抛出IndexError异常
1.1 List的基本操作
List支持一些基本的操作,比如元素的添加、删除、修改和查找。
1.1.1 添加元素
可以使用append方法向List中添加一个元素,该元素将被添加到List的末尾:
my_list = [1, 2, "hello", 3.14]
# 添加一个元素
my_list.append("world")
print(my_list) # 结果为 [1, 2, "hello", 3.14, "world"]
如果要添加多个元素,可以使用extend方法将另一个List里的元素添加到当前List的末尾:
my_list = [1, 2, "hello", 3.14]
# 添加多个元素
my_list.extend([4, 5, "Python"])
print(my_list) # 结果为 [1, 2, "hello", 3.14, 4, 5, "Python"]
1.1.2 删除元素
可以使用del关键字或者remove方法删除List中的元素。
通过下标删除元素:
my_list = [1, 2, "hello", 3.14]
# 删除第一个元素
del my_list[0]
print(my_list) # 结果为 [2, "hello", 3.14]
通过元素的值删除元素:
my_list = [1, 2, "hello", 3.14]
# 删除元素"hello"
my_list.remove("hello")
print(my_list) # 结果为 [1, 2, 3.14]
1.1.3 修改元素
可以直接通过下标修改List中的元素:
my_list = [1, 2, "hello", 3.14]
# 修改第三个元素
my_list[2] = "world"
print(my_list) # 结果为 [1, 2, "world", 3.14]
1.1.4 查找元素
可以使用in关键字判断一个元素是否在List中:
my_list = [1, 2, "hello", 3.14]
# 判断元素是否在List中
print("hello" in my_list) # 结果为 True
print(3 not in my_list) # 结果为 False
如果要获取一个元素在List中的下标,可以使用index方法:
my_list = [1, 2, "hello", 3.14]
# 获取元素在List中的下标
print(my_list.index("hello")) # 结果为 2
2. List的切片操作
切片是指从一个List中取出连续的一个子序列。可以使用冒号运算符来实现切片操作,它的形式为List[start:end]。
其中start表示开始下标(包含),end表示结束下标(不包含)。如果不指定start或end,则默认为List的第一个元素和最后一个元素。
2.1 末尾切片
最简单的切片操作是省略start或end,这样就可以从List的最开始或最末尾开始切片:
my_list = [1, 2, "hello", 3.14]
# 从第一个元素开始取
print(my_list[:2]) # 结果为 [1, 2]
# 从第三个元素开始取到最后一个元素
print(my_list[2:]) # 结果为 ["hello", 3.14]
# 取出所有元素
print(my_list[:]) # 结果为 [1, 2, "hello", 3.14]
2.2 指定步长
可以使用第三个参数来指定步长,默认为1:
my_list = [1, 2, 3, 4, 5, 6]
# 按照步长为2取值
print(my_list[::2]) # 结果为 [1, 3, 5]
# 按照步长为3取值
print(my_list[::3]) # 结果为 [1, 4]
2.3 倒序切片
可以通过指定负数下标来实现倒序切片:
my_list = [1, 2, 3, 4, 5]
# 倒序切片
print(my_list[::-1]) # 结果为 [5, 4, 3, 2, 1]
3. List的排序
可以使用sort方法对List进行排序,该方法会直接修改原有的List元素。
sort方法支持两个可选参数:key和reverse。
其中key是一个函数,表示排序的依据,可以根据元素的某些属性进行排序。reverse表示是否降序,默认为False。
3.1 默认排序
默认情况下,sort方法会按照元素的大小进行排序。如果元素的数据类型不同,则会抛出TypeError异常。
my_list = [5, 2, 3, 1, 4]
# 默认排序
my_list.sort()
print(my_list) # 结果为 [1, 2, 3, 4, 5]
3.2 按照元素某个属性排序
可以使用key参数指定一个函数来进行排序,该函数的返回值将作为排序的依据。
例如,可以按照元素的长度进行排序:
my_list = ["hello", "Python", "world", "Java"]
# 按照元素的长度进行排序
my_list.sort(key=len)
print(my_list) # 结果为 ["Java", "hello", "world", "Python"]
3.3 按照元素的值进行排序(降序)
可以使用reverse参数将List按照降序排列:
my_list = [5, 2, 3, 1, 4]
# 按照降序进行排序
my_list.sort(reverse=True)
print(my_list) # 结果为 [5, 4, 3, 2, 1]
4. List的复制和拷贝
在Python中,List是一种可变的对象,因此需要注意其复制和拷贝的问题。
4.1 直接赋值的问题
当将一个List赋值给另一个List时,它们会引用同一块内存地址,即它们实际上是同一个对象的不同名称而已。
list1 = [1, 2, 3]
list2 = list1
list2[1] = 10
print(list1) # 结果为 [1, 10, 3]
4.2 浅拷贝
可以使用copy方法进行浅拷贝,它会创建一个新的List,但新的List中元素的引用和原始的List中元素的引用相同。
import copy
list1 = [1, 2, ["hello", "world"]]
list2 = list1.copy()
# 改变list2中元素的值
list2[2][1] = "Python"
print(list1) # 结果为 [1, 2, ['hello', 'Python']]
print(list2) # 结果为 [1, 2, ['hello', 'Python']]
4.3 深拷贝
对于嵌套的数据结构,可以使用copy模块的deepcopy函数进行深拷贝,它会创建一个新的List,并递归地将原始List中的所有对象都复制到新的List中。
import copy
list1 = [1, 2, ["hello", "world"]]
list2 = copy.deepcopy(list1)
# 改变list2中元素的值
list2[2][1] = "Python"
print(list1) # 结果为 [1, 2, ['hello', 'world']]
print(list2) # 结果为 [1, 2, ['hello', 'Python']]
5. List的遍历
可以使用for循环遍历List中的元素。
my_list = [1, 2, "hello", 3.14]
# 遍历List中的所有元素
for item in my_list:
print(item)
5.1 使用enumerate函数获取下标
如果需要获取每个元素在List中的下标,可以使用enumerate函数。
my_list = [1, 2, "hello", 3.14]
# 遍历List中的所有元素及其下标
for index, item in enumerate(my_list):
print("下标:%d,元素:%s" % (index, item))
6. List的操作复杂度
Python的List基于动态数组实现,因此List的翻转、拼接、取值、赋值、增删元素的时间复杂度都是O(n)。
然而,在List的末尾添加或删除元素的时间复杂度为O(1)。