Python列表:增删改查、切片、推导式,看这一篇就够了
·
Python列表:增删改查、切片、推导式,看这一篇就够了
前几天我们学了变量、循环、条件判断。今天学一个新的数据结构——列表。列表是Python里最常用的数据结构,可以理解为一个"有序的容器",里面可以放很多东西。
一句话概括
这篇文章解决一个问题:学会Python列表的增删改查操作,以及切片和列表推导式。
什么是列表
列表用方括号 [] 表示,里面可以放任何类型的数据:
# 空列表
empty = []
# 放数字
numbers = [1, 2, 3, 4, 5]
# 放字符串
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
# 混放
mixed = [1, "hello", True, 3.14, None]
# 列表里面放列表(嵌套)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
创建列表
# 直接创建
fruits = ["苹果", "香蕉", "橙子"]
# 用 list() 函数
chars = list("Python") # ['P', 'y', 't', 'h', 'o', 'n']
# 用 range() 创建数字列表
numbers = list(range(1, 10)) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 列表推导式(后面会详细讲)
squares = [x**2 for x in range(1, 6)] # [1, 4, 9, 16, 25]
查:访问列表元素
索引访问
列表的元素可以通过索引访问,索引从0开始:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print(fruits[0]) # 苹果(第一个)
print(fruits[1]) # 香蕉(第二个)
print(fruits[2]) # 橙子(第三个)
print(fruits[3]) # 葡萄(第四个)
# 负索引:从后往前数
print(fruits[-1]) # 葡萄(最后一个)
print(fruits[-2]) # 橙子(倒数第二个)
切片:获取子列表
切片用来获取列表的一部分:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[0:3] # [0, 1, 2](从索引0到2,不包括3)
numbers[3:6] # [3, 4, 5]
numbers[:5] # [0, 1, 2, 3, 4](从头开始可以省略0)
numbers[5:] # [5, 6, 7, 8, 9](到尾可以省略)
numbers[:] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9](复制整个列表)
# 步长切片
numbers[::2] # [0, 2, 4, 6, 8](每隔一个取一个)
numbers[::-1] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0](反转列表)
改:修改列表元素
fruits = ["苹果", "香蕉", "橙子"]
fruits[0] = "草莓" # 修改第一个元素
print(fruits) # ['草莓', '香蕉', '橙子']
增:添加元素
| 方法 | 说明 | 示例 |
|---|---|---|
append(x) |
在末尾添加一个元素 | list.append(4) |
extend(x) |
在末尾添加多个元素(列表) | list.extend([4,5]) |
insert(i, x) |
在指定位置插入元素 | list.insert(0, 'hello') |
fruits = ["苹果", "香蕉"]
fruits.append("橙子") # ['苹果', '香蕉', '橙子']
fruits.extend(["葡萄", "西瓜"]) # ['苹果', '香蕉', '橙子', '葡萄', '西瓜']
fruits.insert(1, "草莓") # ['苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']
删:删除元素
| 方法 | 说明 | 示例 |
|---|---|---|
pop() |
删除并返回最后一个元素 | x = list.pop() |
pop(i) |
删除并返回指定位置元素 | x = list.pop(0) |
remove(x) |
删除第一个匹配的元素 | list.remove('apple') |
del list[i] |
删除指定位置元素 | del list[0] |
clear() |
清空列表 | list.clear() |
fruits = ["苹果", "香蕉", "橙子", "香蕉"]
fruits.pop() # 删除并返回'橙子',fruits=['苹果', '香蕉', '香蕉']
fruits.pop(0) # 删除并返回'苹果',fruits=['香蕉', '香蕉']
fruits.remove("香蕉") # 删除第一个'香蕉',fruits=['香蕉']
del fruits[0] # 删除第一个元素,fruits=[]
fruits.clear() # 清空列表,fruits=[]
常用操作
遍历列表
fruits = ["苹果", "香蕉", "橙子"]
# 方法1:直接遍历值
for fruit in fruits:
print(fruit)
# 方法2:带索引遍历
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
# 方法3:倒序遍历
for fruit in reversed(fruits):
print(fruit)
查找元素
fruits = ["苹果", "香蕉", "橙子"]
# in:判断是否在列表中
if "香蕉" in fruits:
print("找到了香蕉")
# index:找元素位置(找不到会报错)
print(fruits.index("橙子")) # 2
# count:统计元素出现次数
fruits.append("香蕉")
print(fruits.count("香蕉")) # 2
排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# 原地排序(修改原列表)
numbers.sort() # [1, 1, 2, 3, 4, 5, 6, 9]
numbers.sort(reverse=True) # [9, 6, 5, 4, 3, 2, 1, 1]
# 返回新列表(不修改原列表)
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers = sorted(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# 字符串排序
words = ["banana", "apple", "cherry"]
words.sort() # ['apple', 'banana', 'cherry']
words.sort(key=len) # 按长度排序:['apple', 'banana', 'cherry']
列表推导式
这是Python最强大的特性之一,用一行代码创建列表。
基本语法
# 传统写法
squares = []
for x in range(10):
squares.append(x ** 2)
# 列表推导式写法
squares = [x ** 2 for x in range(10)]
带条件的推导式
# 只保留偶数的平方
even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]
# 把字符串转成大写
fruits = ["apple", "banana", "cherry"]
upper = [f.upper() for f in fruits]
# ['APPLE', 'BANANA', 'CHERRY']
多层循环
# 打印所有两两组合
combinations = [(x, y) for x in [1, 2] for y in [3, 4]]
# [(1, 3), (1, 4), (2, 3), (2, 4)]
# flatten:二维列表转一维
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
实战练习:通讯录管理
用列表实现一个简单的通讯录:
contacts = []
def show_menu():
print("=" * 30)
print("通讯录管理系统")
print("1. 添加联系人")
print("2. 查看通讯录")
print("3. 查找联系人")
print("4. 删除联系人")
print("5. 退出")
print("=" * 30)
def add_contact():
name = input("姓名:")
phone = input("电话:")
contacts.append({"name": name, "phone": phone})
print(f"已添加 {name}!")
def show_contacts():
if not contacts:
print("通讯录为空!")
return
print(f"\n通讯录(共 {len(contacts)} 人):")
print("-" * 30)
for i, c in enumerate(contacts):
print(f"{i+1}. {c['name']} - {c['phone']}")
def search_contact():
name = input("输入要查找的姓名:")
found = [c for c in contacts if name in c['name']]
if found:
for c in found:
print(f"找到:{c['name']} - {c['phone']}")
else:
print("没找到!")
def delete_contact():
name = input("输入要删除的姓名:")
global contacts
new_list = [c for c in contacts if c['name'] != name]
if len(new_list) < len(contacts):
contacts = new_list
print("已删除!")
else:
print("没找到!")
while True:
show_menu()
choice = input("选择操作(1-5):")
if choice == "1":
add_contact()
elif choice == "2":
show_contacts()
elif choice == "3":
search_contact()
elif choice == "4":
delete_contact()
elif choice == "5":
print("再见!")
break
else:
print("无效选择!")
常见问题FAQ
Q1:列表和数组有什么区别?
Python的列表比数组灵活得多:
- 数组只能放同一种类型
- 列表可以放任意类型
- 列表长度可以动态变化
- 列表有很多内置方法
如果你需要高效数值计算,用 numpy 的数组。
Q2:list.append() 和 list.extend() 有什么区别?
fruits = ["苹果", "香蕉"]
fruits.append("橙子") # ['苹果', '香蕉', '橙子'](加一个元素)
fruits.extend(["葡萄", "西瓜"]) # ['苹果', '香蕉', '橙子', '葡萄', '西瓜'](加多个元素)
Q3:怎么复制列表?
original = [1, 2, 3]
# 错误!这是引用,不是复制
copy1 = original # 修改copy1会影响original
# 正确:用切片或list()
copy2 = original[:] # 切片复制
copy3 = list(original) # 用list()复制
# 对于嵌套列表,要用copy模块的deepcopy
import copy
deep_copy = copy.deepcopy(original)
写在最后
这篇文章覆盖了列表的核心操作:
- 查:索引、切片、in判断
- 改:直接赋值
- 增:append、extend、insert
- 删:pop、remove、del、clear
- 高级:列表推导式
下一篇文章:Python 字典,键值对操作和 defaultdict 的妙用。
参考资料:
更多推荐


所有评论(0)