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 的妙用。


参考资料

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐