Python数据结构详细

Python数据结构详细攻略

什么是数据结构?

数据结构是计算机中存储、组织数据的方式。常见的数据结构有数组、链表、栈、队列、哈希表、树和图等。不同的数据结构适用于不同的场景,通过选择合适的数据结构能够提高程序的效率和性能。

数组(Array)

数组是一种线性数据结构,它是一组连续的内存空间,用来存储同类型的数据。数组中的元素可以被通过下标访问,下标通常从0开始,用来表示元素在数组中的位置。

示例:

# 定义数组
numbers = [1, 2, 3, 4, 5]

# 访问数组元素
print(numbers[0]) # 输出1
print(numbers[2]) # 输出3

# 修改数组元素
numbers[2] = 6
print(numbers) # 输出[1, 2, 6, 4, 5]

链表(Linked List)

链表也是一种线性数据结构,不同的是它的元素不是存储在连续空间中,而是通过指针相连,形成一个链式结构,链表中的每个节点都包含数据元素和指向下一个节点的指针。

示例:

# 定义链表节点
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 定义链表
class MyLinkedList:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.head = None

    def get(self, index: int) -> int:
        """
        Get the value of the index-th node in the linked list. If the index is invalid, return -1.
        """
        if index < 0 or not self.head:
            return -1
        p = self.head
        for i in range(index):
            p = p.next
            if not p:
                return -1
        return p.val

    def addAtHead(self, val: int) -> None:
        """
        Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.
        """
        self.head = ListNode(val, self.head)

    def addAtTail(self, val: int) -> None:
        """
        Append a node of value val to the last element of the linked list.
        """
        if not self.head:
            self.head = ListNode(val)
        else:
            p = self.head
            while p.next:
                p = p.next
            p.next = ListNode(val)

    def addAtIndex(self, index: int, val: int) -> None:
        """
        Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted.
        """
        if index <= 0:
            self.addAtHead(val)
        else:
            p = self.head
            for i in range(index-1):
                p = p.next
                if not p:
                    return
            p.next = ListNode(val, p.next)

    def deleteAtIndex(self, index: int) -> None:
        """
        Delete the index-th node in the linked list, if the index is valid.
        """
        if index < 0 or not self.head:
            return
        if index == 0:
            self.head = self.head.next
            return
        p = self.head
        for i in range(index-1):
            p = p.next
            if not p:
                return
        if p.next:
            p.next = p.next.next

# 测试链表操作
obj = MyLinkedList()
obj.addAtIndex(0, 1)
obj.addAtIndex(1, 2)
obj.addAtIndex(2, 3)
print(obj.get(1)) # 输出2
obj.deleteAtIndex(1)
print(obj.get(1)) # 输出3

栈(Stack)

栈是一种先进后出(FIFO)的数据结构。它支持两个操作:入栈(push)和出栈(pop)。在栈中,只能在栈顶进行插入和删除操作。

示例:

# 使用Python的列表(list)实现栈
class Stack:
    def __init__(self):
        self.stack = []

    def push(self, item):
        self.stack.append(item)

    def pop(self):
        if not self.is_empty():
            return self.stack.pop()

    def is_empty(self):
        return len(self.stack) == 0

    def peek(self):
        if not self.is_empty():
            return self.stack[-1]

    def size(self):
        return len(self.stack)

# 测试栈操作
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.peek()) # 输出3
s.pop()
print(s.peek()) # 输出2

队列(Queue)

队列是一种先进先出(FIFO)的数据结构。它支持两个操作:入队列(enqueue)和出队列(dequeue)。在队列中,只能在队列尾进行插入操作,在队列头进行删除操作。

示例:

# 使用Python的列表(list)实现队列
class Queue:
    def __init__(self):
        self.queue = []

    def is_empty(self):
        return len(self.queue) == 0

    def enqueue(self, item):
        self.queue.append(item)

    def dequeue(self):
        if not self.is_empty():
            return self.queue.pop(0)

    def size(self):
        return len(self.queue)

# 测试队列操作
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.size()) # 输出3
print(q.dequeue()) # 输出1
print(q.dequeue()) # 输出2

哈希表(Hash Table)

哈希表是一种通过哈希函数将关键字映射到表中位置来实现数据的快速查找的数据结构。哈希表包含一个数组和一个哈希函数,通过哈希函数将关键字映射到数组中的位置,然后在这个位置上存储数据。

示例:

# 使用Python内置哈希表字典(dict)实现哈希表
class HashTable:
    def __init__(self):
        self.table = {}

    def put(self, key, value):
        self.table[key] = value

    def get(self, key):
        return self.table.get(key, -1)

    def remove(self, key):
        if key in self.table:
            del self.table[key]

# 测试哈希表操作
ht = HashTable()
ht.put(1, 'A')
ht.put(2, 'B')
ht.put(3, 'C')
print(ht.get(2)) # 输出B
ht.remove(2)
print(ht.get(2)) # 输出-1

树(Tree)

树是一种非线性的数据结构,它由节点和边组成。每个节点包含一个数据元素和指向其子节点的指针。根节点是整个树的唯一入口。

示例:

# 定义树节点
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 定义二叉搜索树(Binary Search Tree, BST)
class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        if not self.root:
            self.root = TreeNode(val)
        else:
            current_node = self.root
            while True:
                if val < current_node.val:
                    if not current_node.left:
                        current_node.left = TreeNode(val)
                        break
                    else:
                        current_node = current_node.left
                else:
                    if not current_node.right:
                        current_node.right = TreeNode(val)
                        break
                    else:
                        current_node = current_node.right

    def search(self, val):
        current_node = self.root
        while current_node:
            if current_node.val == val:
                return True
            elif val < current_node.val:
                current_node = current_node.left
            else:
                current_node = current_node.right
        return False

# 测试树操作
bst = BST()
bst.insert(5)
bst.insert(3)
bst.insert(7)
print(bst.search(3)) # 输出True
print(bst.search(6)) # 输出False

图(Graph)

图是一种由节点和边组成的非线性数据结构。节点表示图中的元素,边表示图中元素之间的关系。图可以分为有向图和无向图,有向图表示边有方向,无向图表示边没有方向。

示例:

# 定义有向图
graph = {
    'A': ['B', 'C'],
    'B': ['C', 'D'],
    'C': ['D'],
    'D': ['C'],
    'E': ['F'],
    'F': ['C']
}

# 实现深度优先搜索(DFS)
visited = set() # 用set来记录已经遍历的节点集合

def dfs(graph, node):
    if node not in visited: # 如果节点没有遍历过
        visited.add(node) # 将节点加入已遍历集合
        for neighbor in graph[node]: # 遍历所有邻接点
            dfs(graph, neighbor)

dfs(graph, 'A') # 遍历整个图

# 实现广度优先搜索(BFS)
from queue import Queue

def bfs(graph, start):
    visited = set() # 用set来记录已经遍历的节点集合
    q = Queue()
    q.put(start) # 将起始节点加入队列
    visited.add(start) # 将起始节点加入已遍历集合
    while not q.empty():
        node = q.get()
        print(node)
        for neighbor in graph[node]: # 遍历所有邻接点
            if neighbor not in visited: # 如果节点没有遍历过
                visited.add(neighbor) # 将节点加入已遍历集合
                q.put(neighbor) # 将节点加入队列

bfs(graph, 'A') # 遍历整个图

结论

以上就是Python中常见的基本数据结构的详细介绍和示例代码,希望能够对大家编程学习有所帮助。根据不同的场景需要,选择合适的数据结构能够提高程序的效率和性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据结构详细 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Redis 如何实现基于位置信息的地理空间查询?

    Redis 提供了基于位置信息的地理空间查询功能,可以方便地查询指定范围内的地理位置信息。本文将详细讲解 Redis 如何实现基于位置信息的地理空间查询,包括实现原理和使用攻略。 Redis 基于位置信息的地理空间查询的实现原理 Redis 基于位置信息的地理空间查询的实现原理主要包括以下几个方面: 地理位置信息的存储:Redis 使用有序集合(sorted…

    python 2023年5月12日
    00
  • Python线程池的正确使用方法

    当需要进行大量的IO操作时,使用线程池是提高系统效率的常用方法。Python线程池可以允许多个线程同时执行,避免了频繁的线程创建和销毁,提高了程序效率。本文将详细讲解Python线程池的正确使用方法,并提供两个示例说明。 一、Python线程池的安装 安装Python线程池,可以使用Python的内置模块concurrent.futures,它提供了Thre…

    python 2023年5月19日
    00
  • python如何处理程序无法打开

    处理程序无法打开错误是Python编程中经常遇到的问题,通常会发生在尝试打开不存在的文件或者无法打开的文件时。以下是处理此类问题的完整攻略: 1. 确认文件路径是否正确 在Python中,可以通过使用open()函数来打开文件。打开文件时,需要传递文件路径作为参数。如果路径不正确,Python就无法找到文件并读取它们。因此,确认文件路径是正确的是第一步。路径…

    python 2023年5月30日
    00
  • 几款好用的python工具库(小结)

    接下来让我来详细讲解一下“几款好用的Python工具库(小结)”的攻略。 一、前言 Python是一门广泛应用于编程开发、数据处理、人工智能等领域的动态语言,因其简洁易学、方便高效的特性,逐渐被越来越多的人所熟悉和喜爱。而在Python编程中,工具库是一个不可或缺的组成部分,它可以帮助我们大大提高开发效率,让我们的程序更加健壮、高效。 在这篇文章中,我将为大…

    python 2023年5月14日
    00
  • Python自动抢红包教程详解

    Python自动抢红包教程详解 简介 本教程将介绍如何使用Python编写一个自动抢红包程序,并以微信红包为例进行讲解。 程序原理 微信红包是通过微信客户端进行发送和接收的。而微信客户端本身就是运行在手机上的一个应用程序,通过抓取其网络请求包,就可以获取到红包的相关信息并进行自动抢取。而本教程中所使用的是Python的一个第三方库itchat,它的底层是基于…

    python 2023年5月19日
    00
  • 14面向对象

    面向对象 面向对象编程介绍 面向对象编程:Object Oriented Programming,简称OOP,是一种程序设计思想。需要注意的是,与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也都能通过面向过程完成。只是看哪种思想更适合当前开发需求。 面向过程与面向对象区别 面向过程:根据业务逻辑从上到下写代码  面向对象:将数据与…

    python 2023年4月17日
    00
  • 在 Spark 2 解释器下使用 Python 和 Zeppelin

    【问题标题】:Using Python with Zeppelin under the Spark 2 Interpreter在 Spark 2 解释器下使用 Python 和 Zeppelin 【发布时间】:2023-04-04 11:32:01 【问题描述】: 我已经在虚拟机上部署了 HDP: 2.6.4 我可以看到 spark2 没有指向正确的 pyt…

    Python开发 2023年4月6日
    00
  • Python基于Opencv来快速实现人脸识别过程详解(完整版)

    Python基于Opencv来快速实现人脸识别过程详解(完整版) 简介 本文将详细介绍使用Python和OpenCV完成人脸识别的方法和步骤,由于OpenCV是一个广泛应用于计算机视觉的开源库,本文将利用其强大的功能来实现人脸识别的全过程。 步骤 步骤1、 准备数据集 在进行人脸识别过程中,我们需要一个包含训练数据的数据集,数据集是包含一组图片的集合,图片应…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部