Python数据结构概览:除列表和元组外,还有哪些重要数据结构?

在Python中,除了列表(list)和元组(tuple),还有许多其他内置的数据结构,每种都有其独特的特性和用途。了解这些数据结构可以帮助你在不同的场景中选择最合适的一种,从而提高代码的效率和可读性。今天,就让我们一起探索Python中的其他常用数据结构。

一、字典(dict

特点

  • 键值对存储:字典是一种键值对(key-value)的数据结构,通过键来访问对应的值。
  • 无序:字典中的键值对没有固定的顺序(Python 3.7+ 保证插入顺序)。
  • 可变:字典是可变的,可以随时添加、删除或修改键值对。
  • 键必须是不可变类型:键可以是数字、字符串、元组等不可变类型,但不能是列表或其他可变类型。
  • 示例

    my_dict = {"name": "Alice", "age": 30, "role": "Developer"}
    print(my_dict["name"])  # 输出:Alice
    my_dict["age"] = 31
    my_dict["city"] = "New York"
    print(my_dict)  # 输出:{'name': 'Alice', 'age': 31, 'role': 'Developer', 'city': 'New York'}
    

    使用场景

  • 存储配置信息:例如用户信息、系统配置等。
  • 快速查找:通过键快速访问对应的值,适合需要频繁查找的场景。
  • 二、集合(set

    特点

  • 无序集合:集合是一个无序的元素集合,每个元素都是唯一的。
  • 可变:集合是可变的,可以随时添加或删除元素。
  • 去重:集合自动去除重复元素。
  • 示例

    my_set = {1, 2, 3, 4}
    my_set.add(5)
    my_set.remove(2)
    print(my_set)  # 输出:{1, 3, 4, 5}
    

    使用场景

  • 去重:自动去除重复元素,适合需要去重的场景。
  • 集合运算:支持并集、交集、差集等集合运算,适合处理集合关系。
  • 三、队列(queue.Queue

    特点

  • 先进先出:队列是一种先进先出(FIFO)的数据结构,新元素从队尾加入,旧元素从队头移出。
  • 线程安全queue.Queue 是线程安全的,适合多线程环境。
  • 示例

    from queue import Queue
    
    my_queue = Queue()
    my_queue.put(1)
    my_queue.put(2)
    print(my_queue.get())  # 输出:1
    print(my_queue.get())  # 输出:2
    

    使用场景

  • 任务队列:适合处理任务队列,例如在多线程环境中管理任务。
  • 先进先出场景:例如打印任务队列、消息队列等。
  • 四、栈(listcollections.deque

    特点

  • 后进先出:栈是一种后进先出(LIFO)的数据结构,新元素从栈顶加入,旧元素也从栈顶移出。
  • 可变:栈是可变的,可以随时添加或删除元素。
  • 示例

    my_stack = []
    my_stack.append(1)
    my_stack.append(2)
    print(my_stack.pop())  # 输出:2
    print(my_stack.pop())  # 输出:1
    

    或者使用 collections.deque

    from collections import deque
    
    my_stack = deque()
    my_stack.append(1)
    my_stack.append(2)
    print(my_stack.pop())  # 输出:2
    print(my_stack.pop())  # 输出:1
    

    使用场景

  • 函数调用栈:适合模拟函数调用栈。
  • 后进先出场景:例如浏览器的后退功能、括号匹配等。
  • 五、collections 模块中的高级数据结构

    Python 的 collections 模块提供了许多高级数据结构,这些结构在某些场景下非常有用。

    1. collections.Counter

  • 特点:用于计数的字典,自动统计元素的出现次数。
  • 示例
    from collections import Counter
    
    my_list = [1, 2, 2, 3, 3, 3, 4]
    counter = Counter(my_list)
    print(counter)  # 输出:Counter({3: 3, 2: 2, 1: 1, 4: 1})
    
  • 2. collections.defaultdict

  • 特点:提供默认值的字典,当访问不存在的键时,自动创建默认值。
  • 示例
    from collections import defaultdict
    
    my_dict = defaultdict(int)
    print(my_dict["key"])  # 输出:0
    
  • 3. collections.OrderedDict

  • 特点:有序字典,保持插入顺序(Python 3.7+ 的普通字典也保证插入顺序)。
  • 示例
    from collections import OrderedDict
    
    my_dict = OrderedDict([("name", "Alice"), ("age", 30)])
    print(my_dict)  # 输出:OrderedDict([('name', 'Alice'), ('age', 30)])
    
  • 4. collections.namedtuple

  • 特点:创建具名元组,使元组中的元素可以通过名称访问。
  • 示例
    from collections import namedtuple
    
    Point = namedtuple("Point", ["x", "y"])
    p = Point(11, y=22)
    print(p.x)  # 输出:11
    print(p.y)  # 输出:22
    
  • 六、heapq 模块

    特点

  • 堆队列heapq 模块提供了堆队列算法,也称为优先队列。
  • 最小堆:默认是一个最小堆,堆顶元素总是最小的。
  • 示例

    import heapq
    
    my_heap = []
    heapq.heappush(my_heap, 3)
    heapq.heappush(my_heap, 1)
    heapq.heappush(my_heap, 2)
    print(heapq.heappop(my_heap))  # 输出:1
    print(heapq.heappop(my_heap))  # 输出:2
    print(heapq.heappop(my_heap))  # 输出:3
    

    使用场景

  • 优先队列:适合需要按优先级处理任务的场景。
  • 最小值/最大值查询:例如实时获取数据流中的最小值或最大值。
  • 七、array 模块

    特点

  • 数组array 模块提供了高效的数组存储,适合存储大量同类型数据。
  • 类型化:数组中的元素必须是同一种类型,例如整数或浮点数。
  • 示例

    import array
    
    my_array = array.array("i", [1, 2, 3, 4])
    print(my_array[0])  # 输出:1
    my_array.append(5)
    print(my_array)  # 输出:array('i', [1, 2, 3, 4, 5])
    

    使用场景

  • 高效存储:适合存储大量同类型数据,例如图像处理中的像素值。
  • 性能优化:比列表更节省内存,适合处理大规模数据。
  • 八、bisect 模块

    特点

  • 二分查找bisect 模块提供了二分查找和插入的功能,适合有序列表。
  • 高效查找:在有序列表中快速查找或插入元素。
  • 示例

    import bisect
    
    my_list = [1, 2, 4, 5]
    bisect.insort(my_list, 3)
    print(my_list)  # 输出:[1, 2, 3, 4, 5]
    

    使用场景

  • 有序数据:适合需要频繁查找或插入有序数据的场景。
  • 性能优化:比线性查找更高效,适合大规模有序数据。
  • 九、dataclasses 模块(Python 3.7+)

    特点

  • 数据类dataclasses 模块提供了简化类定义的功能,适合存储数据的类。
  • 自动实现方法:自动实现__init____repr____eq__等方法。
  • 示例

    from dataclasses import dataclass
    
    @dataclass
    class Point:
        x: int
        y: int
    
    p = Point(11, 22)
    print(p)  # 输出:Point(x=11, y=22)
    

    使用场景

  • 数据存储:适合需要存储数据的类,例如配置信息、用户信息等。
  • 简化代码:减少样板代码,提高代码可读性。
  • 十、enum 模块(Python 3.4+)

    特点

  • 枚举enum 模块提供了枚举类,适合定义一组固定的常量。
  • 类型安全:枚举值是不可变的,适合定义固定的状态或选项。
  • 示例

    from enum import Enum
    
    class Color(Enum):
        RED = 1
        GREEN = 2
        BLUE = 3
    
    print(Color.RED)  # 输出:Color.RED
    print(Color.RED.value)  # 输出:1
    

    使用场景

  • 固定常量:适合定义一组固定的常量,例如状态码、颜色等。
  • 类型安全:避免使用字符串或整数作为常量,提高代码的可读性和安全性。
  • 十一、types 模块

    特点

  • 动态类型types 模块提供了动态创建类型的功能,适合需要动态生成类或函数的场景。
  • 灵活性:可以在运行时动态创建和修改类型。
  • 示例

    import types
    
    def create_class(name, bases, body):
        return types.new_class(name, bases, {}, lambda ns: ns.update(body))
    
    MyClass = create_class("MyClass", (object,), {"x": 10})
    print(MyClass().x)  # 输出:10
    

    使用场景

  • 动态生成类:适合需要动态生成类或函数的场景,例如元编程。
  • 灵活性:提供运行时动态创建和修改类型的能力。
  • 十二、itertools 模块

    特点

  • 迭代器工具itertools 模块提供了许多用于处理迭代器的工具,适合处理复杂的迭代逻辑。
  • 高效处理:提供了高效的迭代器操作,例如组合、排列、无限序列等。
  • 示例

    import itertools
    
    # 无限序列
    for i in itertools.count(10):
        print(i)
        if i > 20:
            break
    
    # 组合
    for subset in itertools.combinations([1, 2, 3, 4], 2):
        print(subset)
    

    使用场景

  • 复杂迭代:适合需要处理复杂迭代逻辑的场景,例如组合、排列等。
  • 性能优化:提供高效的迭代器操作,适合处理大规模数据。
  • 十三、functools 模块

    特点

  • 函数工具functools 模块提供了许多用于处理函数的工具,适合需要对函数进行操作的场景。
  • 高效处理:提供了高效的函数操作,例如缓存、装饰器等。
  • 示例

    import functools
    
    @functools.lru_cache(maxsize=32)
    def fib(n):
        if n < 2:
            return n
        return fib(n-1) + fib(n-2)
    
    print(fib(10))  # 输出:55
    

    使用场景

  • 函数操作:适合需要对函数进行操作的场景,例如缓存、装饰器等。
  • 性能优化:提供高效的函数操作,适合处理复杂的函数逻辑。
  • 十四、array 模块

    特点

  • 高效数组array 模块提供了高效的数组存储,适合存储大量同类型数据。
  • 类型化:数组中的元素必须是同一种类型,例如整数或浮点数。
  • 示例

    import array
    
    my_array = array.array("i", [1, 2, 3, 4])
    print(my_array[0])  # 输出:1
    my_array.append(5)
    print(my_array)  # 输出:array('i', [1, 2, 3, 4, 5])
    

    使用场景

  • 高效存储:适合存储大量同类型数据,例如图像处理中的像素值。
  • 性能优化:比列表更节省内存,适合处理大规模数据。
  • 十五、memoryview 对象

    特点

  • 内存视图memoryview 对象提供了一个可变的缓冲区接口,适合处理二进制数据。
  • 高效访问:可以直接访问内存中的数据,适合处理大规模二进制数据。
  • 示例

    import array
    
    my_array = array.array("i", [1, 2, 3, 4])
    my_memoryview = memoryview(my_array)
    print(my_memoryview[0])  # 输出:1
    my_memoryview[0] = 10
    print(my_array)  # 输出:array('i', [10, 2, 3, 4])
    

    使用场景

  • 二进制数据:适合处理二进制数据,例如图像处理、网络通信等。
  • 高效访问:直接访问内存中的数据,适合处理大规模数据。
  • 十六、io 模块

    牂点

  • 输入输出io 模块提供了输入输出功能,适合处理文件、网络通信等。
  • 高效处理:提供了高效的输入输出操作,适合处理大规模数据。
  • 示例

    import io
    
    # 内存中的文件对象
    my_file = io.StringIO("Hello, World!")
    print(my_file.read())  # 输出:Hello, World!
    my_file.write("Python is awesome!")
    my_file.seek(0)
    print(my_file.read())  # 输出:Hello, World!Python is awesome!
    

    使用场景

  • 文件操作:适合处理文件、网络通信等。
  • 高效处理:提供高效的输入输出操作,适合处理大规模数据。
  • 十七、pathlib 模块

    特点

  • 路径操作pathlib 模块提供了路径操作功能,适合处理文件路径、目录等。
  • 面向对象:提供了面向对象的路径操作,适合处理复杂的路径逻辑。
  • 示例

    from pathlib import Path
    
    # 获取当前路径
    current_path = Path.cwd()
    print(current_path)  # 输出:当前路径
    
    # 创建新文件
    new_file = current_path / "new_file.txt"
    new_file.touch()
    print(new_file.exists())  # 输出:True
    

    使用场景

  • 文件路径:适合处理文件路径、目录等。
  • 面向对象:提供面向对象的路径操作,适合处理复杂的路径逻辑。
  • 十八、shelve 模块

    特点

  • 持久化存储shelve 模块提供了持久化存储功能,适合存储键值对数据。
  • 高效处理:提供了高效的持久化存储操作,适合处理大规模数据。
  • 示例

    import shelve
    
    # 打开数据库
    with shelve.open("my_shelve") as db:
        db["key"] = "value"
        print(db["key"])  # 输出:value
    

    使用场景

  • 持久化存储:适合存储键值对数据,例如配置信息、用户信息等。
  • 高效处理:提供高效的持久化存储操作,适合处理大规模数据。
  • 十九、sqlite3 模块

    特点

  • 轻量级数据库sqlite3 模块提供了轻量级数据库功能,适合存储大规模数据。
  • 高效处理:提供了高效的数据库操作,适合处理复杂的查询逻辑。
  • 示例

    import sqlite3
    
    # 连接数据库
    conn = sqlite3.connect("my_database.db")
    cursor = conn.cursor()
    
    # 创建表
    cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
    cursor.execute("INSERT INTO users (name) VALUES ('Alice')")
    conn.commit()
    
    # 查询数据
    cursor.execute("SELECT * FROM users")
    print(cursor.fetchall())  # 输出:[(1, 'Alice')]
    
    # 关闭连接
    conn.close()
    

    使用场景

  • 轻量级数据库:适合存储大规模数据,例如用户信息、配置信息等。
  • 高效处理:提供高效的数据库操作,适合处理复杂的查询逻辑。
  • 二十、json 模块

    特点

  • JSON操作json 模块提供了JSON操作功能,适合处理JSON数据。
  • 高效处理:提供了高效的JSON操作,适合处理大规模数据。
  • 示例

    import json
    
    # 序列化
    data = {"name": "Alice", "age": 30}
    json_str = json.dumps(data)
    print(json_str)  # 输出:{"name": "Alice", "age": 30}
    
    # 反序列化
    data = json.loads(json_str)
    print(data)  # 输出:{'name': 'Alice', 'age': 30}
    

    使用场景

  • JSON数据:适合处理JSON数据,例如API通信、配置文件等。
  • 高效处理:提供高效的JSON操作,适合处理大规模数据。
  • 总结

    Python提供了丰富多样的数据结构,每种都有其独特的特性和适用场景。除了列表和元组,还有字典、集合、队列、栈、collections模块中的高级数据结构、heapq模块、array模块、bisect模块、dataclasses模块、enum模块、types模块、itertools模块、functools模块、array模块、memoryview对象、io模块、pathlib模块、shelve模块、sqlite3模块、json模块等。

    选择合适的数据结构可以让你的代码更加高效、安全且易于维护。希望这篇文章能帮助你在Python开发中更好地选择合适的数据结构!如果你还有其他问题或经验,欢迎在评论区留言,我们一起交流。

    作者:黄豆匿zlib

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python数据结构概览:除列表和元组外,还有哪些重要数据结构?

    发表回复