Skip to content

sequences.py

文件信息

  • 📄 原文件:03_sequences.py
  • 🔤 语言:python

Python 序列类型:列表、元组、集合 本文件介绍 Python 中的主要序列类型及其操作。

主要序列类型:

  • list: 可变有序序列
  • tuple: 不可变有序序列
  • set: 可变无序集合(元素唯一)
  • frozenset: 不可变集合

完整代码

python
def main01_list_basics():
    """
    ============================================================
                        1. 列表基础
    ============================================================
    列表(list)是 Python 中最常用的数据结构
    - 可变(mutable)
    - 有序
    - 可包含任意类型元素
    """
    print("=" * 60)
    print("1. 列表基础")
    print("=" * 60)

    # 【创建列表】
    empty_list = []              # 空列表
    empty_list2 = list()         # 使用 list()
    numbers = [1, 2, 3, 4, 5]    # 数字列表
    mixed = [1, "hello", 3.14, True]  # 混合类型
    nested = [[1, 2], [3, 4]]    # 嵌套列表

    print(f"空列表: {empty_list}")
    print(f"数字列表: {numbers}")
    print(f"混合列表: {mixed}")
    print(f"嵌套列表: {nested}")

    # 【从其他类型转换】
    from_string = list("hello")
    from_range = list(range(5))
    print(f"\n从字符串: {from_string}")
    print(f"从 range: {from_range}")

    # 【列表索引】
    fruits = ["apple", "banana", "cherry", "date"]
    print(f"\n列表: {fruits}")
    print(f"fruits[0] = {fruits[0]}")      # 第一个元素
    print(f"fruits[-1] = {fruits[-1]}")    # 最后一个元素
    print(f"fruits[-2] = {fruits[-2]}")    # 倒数第二个

    # 【列表切片】
    print(f"\n切片操作:")
    print(f"fruits[1:3] = {fruits[1:3]}")    # [banana, cherry]
    print(f"fruits[:2] = {fruits[:2]}")      # 前两个
    print(f"fruits[2:] = {fruits[2:]}")      # 从索引2到末尾
    print(f"fruits[::2] = {fruits[::2]}")    # 步长为2
    print(f"fruits[::-1] = {fruits[::-1]}")  # 反转

    # 【修改元素】
    fruits[0] = "apricot"
    print(f"\n修改后: {fruits}")

    # 【切片赋值】
    numbers = [1, 2, 3, 4, 5]
    numbers[1:4] = [20, 30]  # 替换多个元素
    print(f"切片赋值: {numbers}")


def main02_list_methods():
    """
    ============================================================
                        2. 列表方法
    ============================================================
    """
    print("\n" + "=" * 60)
    print("2. 列表方法")
    print("=" * 60)

    # 【添加元素】
    fruits = ["apple", "banana"]
    print(f"原列表: {fruits}")

    fruits.append("cherry")       # 末尾添加单个元素
    print(f"append: {fruits}")

    fruits.insert(1, "apricot")   # 在指定位置插入
    print(f"insert(1, ...): {fruits}")

    fruits.extend(["date", "elderberry"])  # 扩展列表
    print(f"extend: {fruits}")

    # 【技巧】+ 运算符创建新列表,extend 修改原列表
    new_list = fruits + ["fig"]
    print(f"+ 运算符: {new_list}")

    # 【删除元素】
    print("\n--- 删除元素 ---")
    numbers = [1, 2, 3, 2, 4, 2, 5]
    print(f"原列表: {numbers}")

    numbers.remove(2)  # 删除第一个匹配的值
    print(f"remove(2): {numbers}")

    popped = numbers.pop()  # 删除并返回最后一个元素
    print(f"pop(): 返回 {popped}, 列表 {numbers}")

    popped = numbers.pop(0)  # 删除并返回指定位置的元素
    print(f"pop(0): 返回 {popped}, 列表 {numbers}")

    del numbers[0]  # 使用 del 删除
    print(f"del numbers[0]: {numbers}")

    numbers.clear()  # 清空列表
    print(f"clear(): {numbers}")

    # 【查找和计数】
    print("\n--- 查找和计数 ---")
    letters = ['a', 'b', 'c', 'b', 'd', 'b']
    print(f"列表: {letters}")
    print(f"index('b'): {letters.index('b')}")     # 第一个 'b' 的索引
    print(f"count('b'): {letters.count('b')}")     # 'b' 出现的次数
    print(f"'b' in letters: {'b' in letters}")     # 成员检测

    # 【排序】
    print("\n--- 排序 ---")
    numbers = [3, 1, 4, 1, 5, 9, 2, 6]
    print(f"原列表: {numbers}")

    # sort() 原地排序,修改原列表
    numbers.sort()
    print(f"sort(): {numbers}")

    numbers.sort(reverse=True)  # 降序
    print(f"sort(reverse=True): {numbers}")

    # sorted() 返回新列表,不修改原列表
    words = ["banana", "Apple", "cherry"]
    sorted_words = sorted(words)
    print(f"\nsorted(): {sorted_words}")

    # 自定义排序键
    sorted_by_len = sorted(words, key=len)
    print(f"按长度排序: {sorted_by_len}")

    sorted_lower = sorted(words, key=str.lower)
    print(f"忽略大小写: {sorted_lower}")

    # 【反转】
    print("\n--- 反转 ---")
    numbers = [1, 2, 3, 4, 5]
    numbers.reverse()  # 原地反转
    print(f"reverse(): {numbers}")

    # reversed() 返回迭代器
    print(f"reversed(): {list(reversed(numbers))}")

    # 【复制】
    print("\n--- 复制 ---")
    original = [1, 2, [3, 4]]

    # 浅拷贝
    shallow1 = original.copy()
    shallow2 = original[:]
    shallow3 = list(original)

    print(f"原列表: {original}")
    print(f"浅拷贝: {shallow1}")

    # 【警告】浅拷贝只复制一层!
    shallow1[2][0] = 99
    print(f"修改浅拷贝后,原列表也变了: {original}")

    # 【技巧】深拷贝
    import copy
    original = [1, 2, [3, 4]]
    deep = copy.deepcopy(original)
    deep[2][0] = 99
    print(f"\n深拷贝后修改,原列表不变: {original}")


def main03_tuple():
    """
    ============================================================
                        3. 元组 tuple
    ============================================================
    元组是不可变的有序序列
    - 不可变(immutable)
    - 有序
    - 可哈希(可作为字典键)
    """
    print("\n" + "=" * 60)
    print("3. 元组 tuple")
    print("=" * 60)

    # 【创建元组】
    empty_tuple = ()
    empty_tuple2 = tuple()
    single = (1,)          # 【注意】单元素元组需要逗号!
    not_tuple = (1)        # 这是整数,不是元组!
    numbers = (1, 2, 3)
    mixed = (1, "hello", 3.14)

    print(f"空元组: {empty_tuple}")
    print(f"单元素元组: {single}, 类型: {type(single)}")
    print(f"(1) 的类型: {type(not_tuple)}")  # int!
    print(f"数字元组: {numbers}")

    # 【元组解包】
    print("\n--- 元组解包 ---")
    point = (10, 20, 30)
    x, y, z = point
    print(f"解包: x={x}, y={y}, z={z}")

    # 星号解包
    first, *rest = (1, 2, 3, 4, 5)
    print(f"星号解包: first={first}, rest={rest}")

    *start, last = (1, 2, 3, 4, 5)
    print(f"星号解包: start={start}, last={last}")

    # 【元组操作】
    print("\n--- 元组操作 ---")
    t1 = (1, 2, 3)
    t2 = (4, 5, 6)

    print(f"拼接: {t1 + t2}")
    print(f"重复: {t1 * 2}")
    print(f"长度: {len(t1)}")
    print(f"成员检测: {2 in t1}")
    print(f"索引: {t1[1]}")
    print(f"切片: {t1[1:]}")

    # 【元组方法】(只有两个)
    t = (1, 2, 3, 2, 4, 2)
    print(f"\nindex(2): {t.index(2)}")
    print(f"count(2): {t.count(2)}")

    # 【命名元组】更具可读性
    print("\n--- 命名元组 ---")
    from collections import namedtuple

    Point = namedtuple('Point', ['x', 'y', 'z'])
    p = Point(10, 20, 30)

    print(f"命名元组: {p}")
    print(f"p.x = {p.x}")
    print(f"p[0] = {p[0]}")
    print(f"解包: {p.x}, {p.y}, {p.z}")

    # 转换为字典
    print(f"_asdict(): {p._asdict()}")

    # 【技巧】使用 typing.NamedTuple(Python 3.6+)
    from typing import NamedTuple

    class Person(NamedTuple):
        name: str
        age: int
        city: str = "Unknown"  # 带默认值

    person = Person("Alice", 25)
    print(f"\nPerson: {person}")
    print(f"person.name = {person.name}")

    # 【元组 vs 列表】
    print("\n--- 元组 vs 列表 ---")
    print("元组优势:")
    print("  1. 不可变,更安全")
    print("  2. 可哈希,能作为字典键")
    print("  3. 内存占用更小")
    print("  4. 访问速度略快")


def main04_set():
    """
    ============================================================
                        4. 集合 set
    ============================================================
    集合是无序的、元素唯一的可变容器
    - 元素唯一(自动去重)
    - 无序
    - 元素必须是可哈希的
    """
    print("\n" + "=" * 60)
    print("4. 集合 set")
    print("=" * 60)

    # 【创建集合】
    empty_set = set()    # 【注意】{} 是空字典,不是空集合!
    numbers = {1, 2, 3, 4, 5}
    from_list = set([1, 2, 2, 3, 3, 3])  # 自动去重

    print(f"空集合: {empty_set}")
    print(f"数字集合: {numbers}")
    print(f"从列表创建(去重): {from_list}")

    # 【添加和删除】
    print("\n--- 添加和删除 ---")
    s = {1, 2, 3}
    print(f"原集合: {s}")

    s.add(4)
    print(f"add(4): {s}")

    s.update([5, 6, 7])
    print(f"update([5, 6, 7]): {s}")

    s.remove(7)  # 元素不存在会报错
    print(f"remove(7): {s}")

    s.discard(100)  # 元素不存在不会报错
    print(f"discard(100): {s}")

    popped = s.pop()  # 随机删除一个元素
    print(f"pop(): 返回 {popped}, 集合 {s}")

    # 【集合运算】(集合论)
    print("\n--- 集合运算 ---")
    a = {1, 2, 3, 4, 5}
    b = {4, 5, 6, 7, 8}
    print(f"a = {a}")
    print(f"b = {b}")

    # 并集
    print(f"\n并集 a | b: {a | b}")
    print(f"并集 a.union(b): {a.union(b)}")

    # 交集
    print(f"\n交集 a & b: {a & b}")
    print(f"交集 a.intersection(b): {a.intersection(b)}")

    # 差集
    print(f"\n差集 a - b: {a - b}")
    print(f"差集 a.difference(b): {a.difference(b)}")

    # 对称差集(异或)
    print(f"\n对称差集 a ^ b: {a ^ b}")
    print(f"对称差集 a.symmetric_difference(b): {a.symmetric_difference(b)}")

    # 【子集和超集】
    print("\n--- 子集和超集 ---")
    small = {1, 2}
    big = {1, 2, 3, 4, 5}

    print(f"small = {small}")
    print(f"big = {big}")
    print(f"small <= big (子集): {small <= big}")
    print(f"small < big (真子集): {small < big}")
    print(f"big >= small (超集): {big >= small}")
    print(f"small.issubset(big): {small.issubset(big)}")
    print(f"big.issuperset(small): {big.issuperset(small)}")

    # 【不相交判断】
    c = {10, 20}
    print(f"\nc = {c}")
    print(f"a.isdisjoint(c): {a.isdisjoint(c)}")  # 无交集返回 True

    # 【frozenset 不可变集合】
    print("\n--- frozenset 不可变集合 ---")
    fs = frozenset([1, 2, 3])
    print(f"frozenset: {fs}")
    # fs.add(4)  # 报错!不能修改

    # frozenset 可以作为字典键或集合元素
    d = {fs: "value"}
    print(f"frozenset 作为字典键: {d}")


def main05_common_operations():
    """
    ============================================================
                    5. 序列通用操作
    ============================================================
    """
    print("\n" + "=" * 60)
    print("5. 序列通用操作")
    print("=" * 60)

    # 以下操作适用于所有序列类型

    # 【成员测试】
    print("--- 成员测试 ---")
    seq = [1, 2, 3, 4, 5]
    print(f"3 in {seq}: {3 in seq}")
    print(f"10 not in {seq}: {10 not in seq}")

    # 【拼接和重复】
    print("\n--- 拼接和重复 ---")
    print(f"[1, 2] + [3, 4]: {[1, 2] + [3, 4]}")
    print(f"(1, 2) + (3, 4): {(1, 2) + (3, 4)}")
    print(f"[1, 2] * 3: {[1, 2] * 3}")

    # 【长度、最大、最小、求和】
    print("\n--- 聚合函数 ---")
    numbers = [3, 1, 4, 1, 5, 9, 2, 6]
    print(f"列表: {numbers}")
    print(f"len(): {len(numbers)}")
    print(f"max(): {max(numbers)}")
    print(f"min(): {min(numbers)}")
    print(f"sum(): {sum(numbers)}")

    # 【any 和 all】
    print("\n--- any 和 all ---")
    bools = [True, True, False]
    print(f"列表: {bools}")
    print(f"all(): {all(bools)}")  # 所有为 True 才返回 True
    print(f"any(): {any(bools)}")  # 有一个 True 就返回 True

    # 空列表
    print(f"all([]): {all([])}")  # True(空序列)
    print(f"any([]): {any([])}")  # False

    # 【enumerate 和 zip】
    print("\n--- enumerate 和 zip ---")
    names = ["Alice", "Bob"]
    ages = [25, 30]

    for i, name in enumerate(names):
        print(f"  {i}: {name}")

    for name, age in zip(names, ages):
        print(f"  {name}: {age}岁")

    # 【技巧】同时获取最大值和索引
    numbers = [3, 1, 4, 1, 5, 9, 2, 6]
    max_idx, max_val = max(enumerate(numbers), key=lambda x: x[1])
    print(f"\n最大值 {max_val} 在索引 {max_idx}")

    # 【filter 和 map】
    print("\n--- filter 和 map ---")
    numbers = [1, 2, 3, 4, 5, 6]

    # filter: 过滤
    evens = list(filter(lambda x: x % 2 == 0, numbers))
    print(f"filter 偶数: {evens}")

    # map: 映射
    squares = list(map(lambda x: x**2, numbers))
    print(f"map 平方: {squares}")

    # 【技巧】推导式通常更 Pythonic
    evens = [x for x in numbers if x % 2 == 0]
    squares = [x**2 for x in numbers]

    # 【reduce】
    print("\n--- reduce ---")
    from functools import reduce
    numbers = [1, 2, 3, 4, 5]
    product = reduce(lambda x, y: x * y, numbers)
    print(f"reduce 乘积: {product}")


if __name__ == "__main__":
    main01_list_basics()
    main02_list_methods()
    main03_tuple()
    main04_set()
    main05_common_operations()

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布