一、引言
在Python中,列表和元组是两种最常用的序列类型,它们看似相似却有着本质区别。方括号[]
创建的列表是可变的 ,允许动态增删元素;而圆括号()
创建的元组是不可变的,一旦创建便无法修改。这种差异决定了它们的不同用途:列表用于需要频繁操作的数据集合,元组则适用于保持数据完整性和作为字典键等场景。
二、列表
2.1 列表的创建
python
# 1.创建空列表 - 两种等效方法
empty_list = [] # 使用方括号
empty_list2 = list() # 使用list()构造函数
# 2.创建包含元素的列表
fruits = ['apple', 'banana', 'orange', 'grape'] # 字符串列表
numbers = [1, 2, 3, 4, 5] # 整数列表
mixed = [1, 'hello', 3.14, True] # 混合类型列表
# 3.从其他数据类型创建列表
from_string = list("hello") # 将字符串转换为字符列表
>>> ['h', 'e', 'l', 'l', 'o']
from_range = list(range(5)) # 将range对象转换为列表
>>> [0, 1, 2, 3, 4]
tuple1 = ("cat", "dog", "bird") # 将元组转换为列表
tuple_to_list = list(tuple1)
>>> ['cat', 'dog', 'bird']
# 4.列表推导式创建列表
# [略](https://juejin.cn/post/7562113701395906594)
语法格式:
list(iterable)
参数
iterable
:可选参数,指 "可迭代对象"(比如字符串、元组、字典、集合、range 对象等)
2.2 列表的访问
Python列表支持索引和切片操作,可以方便地访问和获取子列表。
python
fruits = ["apple", "banana", "orange", "grape", "mango"]
# 1.索引访问 [offset]
print("第一个元素:", fruits[0])
print("最后一个元素:", fruits[-1])
# 2.切片操作访问 [start:end:step]
print("前三个:", fruits[0:3])
print("从第三个到最后:", fruits[2:])
print("所有元素:", fruits[:])
print("反转列表:", fruits[::-1])
2.3 列表的增删查改
列表是可变的,这意味着我们可以修改、添加或删除其中的元素。
python
fruits = ["apple", "banana", "orange"]
'''1.修改元素 - 通过索引直接赋值'''
fruits[1] = "blueberry"
print(fruits) # 输出: ['apple', 'blueberry', 'orange']
'''2.添加元素 - 三种方法'''
# 2.1 append()在列表末尾添加单个元素
fruits.append("grape")
print(fruits) # 输出: ['apple', 'blueberry', 'orange', 'grape']
# 2.2 insert()在指定位置插入单个元素
fruits.insert(1, "cherry")
print(fruits) # 输出: ['apple', 'cherry', 'blueberry', 'orange', 'grape']
# 2.3 extend()或 += 在末尾添加(多个)元素
fruits.extend(["mango", "pineapple"]) # 与 fruits += ["mango", "pineapple"] 效果相同
print(fruits) # 输出: ['apple', 'cherry', 'blueberry', 'orange', 'grape', 'mango', 'pineapple']
'''3.删除元素 - 四种基本方法'''
# 3.1 pop()删除并返回最后一个元素
removed = fruits.pop()
print(removed) # 输出: pineapple
print(fruits) # 输出: ['apple', 'cherry', 'blueberry', 'orange', 'grape', 'mango']
# 3.2 pop(index)删除指定位置的单个元素
removed = fruits.pop(1)
print(removed) # 输出: cherry
print(fruits) # 输出: ['apple', 'blueberry', 'orange', 'grape', 'mango']
# 3.3 remove()删除第一个匹配的元素值
fruits.remove("orange")
print(fruits) # 输出: ['apple', 'blueberry', 'grape', 'mango']
# 3.4 del删除
# 删除指定索引元素
del fruits[0]
print(fruits) # 输出: ['blueberry', 'grape', 'mango']
# 删除切片
del fruits[0:2]
print(fruits) # 输出: ['mango']
# 删除列表
del fruits
print(fruits) # 输出:NameError: name 'fruits' is not defined
'''4.删除元素 - 条件删除方法'''
# 原列表
lst = [1, 2, 3, 4, 5, 6]
# 删除所有偶数(保留奇数)- 列表推导式
new_lst = [x for x in lst if x % 2 != 0]
print(new_lst) # 输出:[1, 3, 5]
print(lst) # 原列表不变:[1, 2, 3, 4, 5, 6]
'''5.清空列表'''
fruits.clear()
print(fruits) # 输出: []
Python 的
extend()
方法是列表(list)的核心内置方法之一,作用是将另一个可迭代对象(如列表、字符串、元组等)的所有元素 "逐个添加" 到当前列表末尾 ,区别于append()
方法(直接将整个可迭代对象作为单个元素添加)。
2.4 列表的方法
python
# 查找最大/最小值和其他统计信息
nums = [5, 2, 8, 1, 9]
print(max(nums)) # 9
print(min(nums)) # 1
print(sum(nums)) # 25
# 使用index()查询具有特定值的元素位置
fruits = ["apple", "banana", "orange", "apple"]
print(fruits.index('banana')) # 输出:1
# 使用in判断值是否存在
print('apple' in fruits) # 输出:True
# 使用count()记录特定值出现的次数
print(fruits.count('apple')) # 输出:2
# 使用len()获取长度
print(len(fruits)) # 输出:4
# 使用sort()重新排列元素
nums.sort() # 升序
print("升序数值:", nums) # 输出:升序数值:[1, 2, 5, 8, 9]
nums.sort(reverse=True) # 降序
print("降序数值:", nums) # 输出:降序数值:[9, 8, 5, 2, 1]
# 复制列表 - 三种方法
original = [1, 2, 3]
shallow_copy = original.copy() # 使用copy()方法
deep_copy = original[:] # 使用切片操作
also_copy = list(original) # 使用list()构造函数
三、元组
3.1 元组基本操作
python
# 创建空元组
empty_tuple = ()
empty_tuple2 = tuple()
print(empty_tuple) # 输出: ()
# 创建单个元素的元组(注意逗号)
single_item = (42,)
print(single_item) # 输出: (42,)
# 省略括号的创建方式
simple_tuple = 1, 2, 3
print(simple_tuple) # 输出: (1, 2, 3)
创建包含一个或多个元素的元组时,每一个元素后面都需要跟着一个逗号,即使只包含一个元素也不能省略。但是,如果创建的元组所包含的元素数量超过1,最后一个元素后面的逗号可以省略
3.2 元组解包
解包就是将容器类型(如元组、列表、字典等)中的元素分解为单个变量的过程。
解包就是把容器中的元素分配给多个变量。
python
# 基本解包
person = ("Alice", 25, "Engineer")
name, age, job = person
print(name) # 输出: Alice
print(age) # 输出: 25
print(job) # 输出: Engineer
# 星号解包(Python 3.0+)
numbers = (1, 2, 3, 4, 5)
first, *middle, last = numbers
print(first) # 输出: 1
print(middle) # 输出: [2, 3, 4]
print(last) # 输出: 5
# 交换变量值
a = 10
b = 20
a, b = b, a
print(f"a = {a}, b = {b}") # 输出: a = 20, b = 10
四、高级列表操作
4.1 zip函数 - "打包"函数
想象你有两列(或多列)数据,zip就像拉链一样,把对应的元素配对在一起。
python
# 三个列表一起zip
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
jobs = ["工程师", "医生", "老师"]
result = list(zip(names, ages, jobs))
print(result)
# 输出: [('Alice', 25, '工程师'), ('Bob', 30, '医生'), ('Charlie', 35, '老师')]
# 长度不同的列表
list1 = [1, 2, 3, 4]
list2 = ["a", "b", "c"] # 只有3个元素
result = list(zip(list1, list2))
print(result) # 输出: [(1, 'a'), (2, 'b'), (3, 'c')]
# 注意:zip以最短的列表为准
4.2 map函数 - "转换"函数
map就像是一个"加工厂",对列表中的每个元素进行同样的操作。
map的语法
python
map(函数, 列表)
map的用法
python
# 示例1:数字运算
numbers = [1, 2, 3, 4, 5]
# 每个数字乘以2
doubled = list(map(lambda x: x * 2, numbers))
print(doubled) # 输出: [2, 4, 6, 8, 10]
# 示例2:使用预定义函数
def add_prefix(name):
return "学生_" + name
names = ["Alice", "Bob", "Charlie"]
prefixed_names = list(map(add_prefix, names))
print(prefixed_names) # 输出: ['学生_Alice', '学生_Bob', '学生_Charlie']
4.3 filter函数 - "过滤"函数
filter的语法
python
filter(判断条件, 列表)
filter的用法
python
# 示例1:数字过滤
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 筛选大于5的数字
big_numbers = list(filter(lambda x: x > 5, numbers))
print(big_numbers) # 输出: [6, 7, 8, 9, 10]
# 示例2:使用预定义函数
def is_adult(age):
return age >= 18
ages = [15, 22, 17, 25, 16, 30]
adults = list(filter(is_adult, ages))
print(adults) # 输出: [22, 25, 30]
经典白学:
map
和filter
现在都可以被更强大易读的列表推导式所替代,所以没懂也没关系哈哈。 在实际项目中,我强烈推荐大家多使用列表推导式,因为它更符合人类的阅读习惯,写起来就像说英语一样直观------"我要从这个列表中选取满足条件的元素,然后对它们进行某种处理"。这种清晰的表达方式让代码更易读、易维护。当然,这并不意味着map和filter函数就没有价值了,了解它们仍然很重要,一方面能帮助你阅读和理解一些历史代码库