Python-Basic Day-2 python容器(列表、元组)

一、引言

在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]

经典白学:mapfilter现在都可以被更强大易读的列表推导式所替代,所以没懂也没关系哈哈。 在实际项目中,我强烈推荐大家多使用列表推导式,因为它更符合人类的阅读习惯,写起来就像说英语一样直观------"我要从这个列表中选取满足条件的元素,然后对它们进行某种处理"。这种清晰的表达方式让代码更易读、易维护。当然,这并不意味着map和filter函数就没有价值了,了解它们仍然很重要,一方面能帮助你阅读和理解一些历史代码库

相关推荐
Angel Q.22 分钟前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰1 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~1 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬1 小时前
统计verilog .v文件中output 的bit数
python
gwf2162 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升2 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi2 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H3 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
金銀銅鐵4 小时前
[Python] 用 turtle 来绘制瑞典国旗
python
Albert Edison4 小时前
【GUI 自动化测试】Pywinauto 常见操作
自动化测试·python·pywinauto