Files
python/13-17/08list.py
T
2026-05-06 11:21:42 +08:00

258 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 列表是什么?
# 列表 是一个有序、可变的集合,可以存储任意数量、任意类型的元素。
# 有序:元素有固定的位置(索引),按添加的顺序排列。
# 可变:创建后,可以修改列表的内容(增、删、改)。
# 异构:一个列表中可以包含不同类型的数据(整数、字符串、甚至其他列表)
# 创建列表
# 使用[]
empty_list = []
print(empty_list)
number = [1, 2, 3, 4]
mixed = [1, True, "hello"]
print(number)
print(mixed)
# 使用list()构造函数
# 创建列表除了用方括号 [],也可以用内置的 list() 函数。
# list() 可以将其他可迭代对象(如字符串、元组、字典、集合等)转换为列表。
# 如果传入一个字符串,每个字符会成为列表中的一个元素。
# 如果传入一个元组,列表会包含元组中的元素。
# 如果不传参数,会得到一个空列表。
# 字符串
list_from_string = list("abc")
print(list_from_string) # ['a', 'b', 'c']
# 元组
list_from_tuple = list((1, 2, 3))
print(list_from_tuple) # [1, 2, 3]
# 不传
list_from_empty = list()
print(list_from_empty) # []
# 访问列表元素(索引和切片)
# 索引访问 从0开始
list_number = [1, 2, 3]
print(list_number[0]) # 1
print(list_number[-1]) # 3
# print(list_number[100]) # IndexError: list index out of range
# 切片访问
# 切片用于获取列表的一个子集,语法:list[start:stop:step]
# 注意:会创建新列表,不会修改原列表
# start:起始索引(包含)
# stop:结束索引(不包含)
# step:步长(默认为1
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(numbers[2:5]) # [2, 3, 4]
print(numbers[:5]) # [0, 1, 2, 3, 4]
print(numbers[5:]) # [ 5, 6, 7, 8]
print(numbers[::2]) # [0, 2, 4, 6, 8]
print(numbers[::-1]) # [8, 7, 6, 5, 4, 3, 2, 1, 0] 反转列表
new_numer = numbers[1:4]
print(new_numer) # [1,2,3]
# 操作
# 修改元素
fruits = ["apple", "banana", "cherry"]
fruits[0] = "pick"
print(fruits) # ["pick", "banana", "cherry"]
# 添加元素
# append(x)
# 在列表末尾添加一个元素x
# insert(index,x)
# 在指定位置 index 插入元素 x,原有及后续元素后移。
# extend(iterable)
# 将另一个可迭代对象(如列表、元组等)的元素逐个添加到列表末尾。
# 注意:
# append() 是把一个元素作为整体添加到末尾
# extend() 是把所有元素分别添加到原列表
# append
a = [1, 2]
a.append([3, 4])
print(a) # [1, 2, [3, 4]] 会把[3,4] 作为一个整体添加到列表中
b = [1, 2]
b.extend([3, 4])
print(b) # [1, 2, 3, 4] 将[3,4]分别添加到列表中
c = [1, 2]
c.insert(1, 3)
print(c) # [1, 3, 2] 往指定位置添加
# 删除
# 在操作列表时,常常需要删除其中的元素。Python 提供了多种删除列表元素的方法,主要包括:
# remove(x) 方法
# 用于删除列表中第一个值为 x 的元素(如果没有这样的元素会抛出 ValueError)。
# 只会删除找到的第一个匹配项。
# 语法:list.remove(x)
# pop([index]) 方法
# 用于删除并返回给定索引处的元素。如果没有指定索引,默认删除并返回最后一个元素。
# 如果索引越界会抛出 IndexError。
# 语法:list.pop() 或 list.pop(index)
# del 语句
# del 可以根据索引删除列表的指定元素,也可以一次性删除多个元素(切片)。
# 语法:del list[index] 或 del list[start:end]
# clear() 方法
# 清空整个列表,变成空列表 []。
# 语法:list.clear()
# - remove() 删除第一个匹配的元素
fruits = ["apple", "banana", "cherry", "banana", "date"]
fruits.remove("banana")
print(fruits) # ['apple', 'cherry', 'banana', 'date']
# - pop() - 删除指定索引的元素并返回指定索引(默认删除最后一个)
fruits.pop()
print(fruits) # ['apple', 'cherry', 'banana']
fruits.pop(2)
print(fruits) # ['apple', 'cherry']
# - del(index) 按照索引删除
del fruits[0]
print(fruits) # ['cherry']
# - clear() 清空数组
fruits.clear()
print(fruits) # []
# 其他操作
# 拼接:用加号 + 可以合并两个或多个列表,形成一个新列表,不改变原列表。
# 重复:用乘号 * 可以将列表重复多次,得到新列表。
# 成员测试:使用 in 或 not in 快速判断某个元素是否存在于列表中,结果为布尔值。
# 获取长度:len(lst) 得到列表中的元素数量。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2
print(list3) # [1, 2, 3, 4, 5, 6]
list4 = [7, 8]
list5 = list4 * 2
print(list5) # [7, 8, 7, 8]
# 检查元素是否存在
list6 = [9, 10, 11]
print(12 in list6) # False
# 获取列表长度
print(len(list6)) # 3
# sorce()排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# reverse()反转
numbers.reverse()
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
# 查找索引index
print(numbers.index(9)) # 0
# count() 计数
print(numbers.count(1)) # 2
# copy() 复制
numbers_copy = numbers.copy()
# 等价于
# numbers_copy = numbers[:]
# numbers_copy = list[numbers]
# 列表遍历
# 直接遍历元素
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# 遍历索引和元素
# 使用 enumerate 可以在遍历列表时同时获得每个元素的索引和值。
for index, fruit in enumerate(fruits):
print(f"索引{index}的值是{fruit}")
# 列表推导式
# 列表推导式(List Comprehensions)是 Python 提供的一种简洁优雅的构造新列表的方法。它既可以替代传统的 for 循环,也可以在创建列表时加入条件判断,让表达更加简明
# 语法
# new_list = [表达式 for 变量 in list]
# 等同于
# new_list = []
# for 变量 in list:
# new_list.append(表达式)
# 可以添加条件的列表推导式
# new_list = [表达式 for 变量 in list if 条件]
# 示例
# 生成偶数数字的平方根
num = [1, 2, 3, 4]
new_num = [n**2 for n in num if n % 2 == 0]
print(new_num) # [4, 16]
# 列表推到常用来构建,转换,筛选列表
# 构建
squares = [n**2 for n in range(5)]
print(squares) # [0, 1, 4, 9, 16]
# 转换
fruits = ["Apple", "Banana", "cherry"]
low_list = [f.lower() for f in fruits]
print(low_list) # ['apple', 'banana', 'cherry']
# 筛选
num = [1, 2, 3, 4]
new_num = [n**2 for n in num if n % 2 == 0]
print(new_num) # [4, 16]
# 多维列表
# 2x3 矩阵(二维列表)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 访问元素
print(matrix[0]) # [1, 2, 3] - 第一行
print(matrix[1][2]) # 6 - 第二行第三列
# 遍历二维列表
for row in matrix:
for element in row:
print(element, end=" ")
print() # 换行
# 输出:
# 1 2 3
# 4 5 6
# 7 8 9
# 注意
# 深,浅拷贝
# 浅拷贝(shallow copy)和深拷贝(deep copy)是列表复制时的两个概念,尤其是在涉及多维列表(嵌套列表)时需要特别注意。
# 浅拷贝:只复制最外层的列表对象,内部的子对象依然引用原来的地址。常用 list.copy()、切片[:] 或 list() 实现。
# 深拷贝:不仅复制最外层列表,也递归复制所有子对象,互不影响。需要用 copy.deepcopy()(需 import copy)。
# 浅拷贝
a = [[1, 2], [3, 4]]
b = a.copy()
b[1].append(5)
print(a) # [1, 2], [3, 4, 5]]
print(b) # [1, 2], [3, 4, 5]]
# 深拷贝
import copy
c = [[1, 2], [3, 4]]
d = copy.deepcopy(c)
d[1].append(5)
print(c) # [[1, 2], [3, 4]]
print(d) # [[1, 2], [3, 4, 5]]