python教程(三):python高级数据结构大全(附代码)

news2024/9/21 13:53:59

Python 中的高级数据结构是基于标准数据结构的扩展,提供了更高效的操作和更复杂的功能。这些数据结构通常用于解决特定的编程问题或优化性能。下面是一些常见的高级数据结构及其应用。

1. 双端队列(deque)

描述:

deque 是双端队列,支持在两端快速添加和删除元素,效率高于列表。

操作:

append(x):在右端添加元素。
appendleft(x):在左端添加元素。
pop():从右端移除元素。
popleft():从左端移除元素。
extend(iterable):从右端添加多个元素。
extendleft(iterable):从左端添加多个元素,顺序反转。
rotate(n):向右旋转 n 个元素。

应用场景:

用于需要在两端操作的场景,如滑动窗口算法、栈和队列实现。

from collections import deque

d = deque()
d.append('right')
d.appendleft('left')
d.pop()  # 移除右端元素
d.popleft()  # 移除左端元素
print(d)  # deque([])

2. 有序字典(OrderedDict)

描述:

OrderedDict 是保持元素插入顺序的字典。

操作:

popitem(last=True):移除并返回最后一个键值对,last=False时移除第一个键值对。
move_to_end(key, last=True):将某个键值对移动到字典的一端。

应用场景:

适用于需要保持键值插入顺序的场景,如实现 LRU 缓存。

from collections import OrderedDict

od = OrderedDict()
od['one'] = 1
od['two'] = 2
od['three'] = 3

for key, value in od.items():
    print(key, value)

3. 默认字典(defaultdict)

描述:

defaultdict 是字典的子类,允许设置默认值,当访问不存在的键时,会自动返回默认值。

操作:

与普通字典操作一致,但会自动提供默认值,避免 KeyError。

应用场景:

适合在需要为不存在的键设置默认值的场景,如自动生成列表、计数器等。

from collections import defaultdict

dd = defaultdict(list)
dd['fruits'].append('apple')
dd['fruits'].append('banana')

print(dd['fruits'])  # ['apple', 'banana']

4. 计数器(Counter)

描述:

Counter 是字典的子类,用于统计可哈希对象的出现次数。

操作:

elements():返回计数器中所有元素。
most_common([n]):返回出现次数最多的前 n 个元素。
subtract([iterable-or-mapping]):从计数器中减去元素。

应用场景:

适用于计数场景,如统计词频、投票计数等。

from collections import Counter

c = Counter(['apple', 'banana', 'apple', 'orange'])
print(c)  # Counter({'apple': 2, 'banana': 1, 'orange': 1})
print(c.most_common(1))  # [('apple', 2)]

5. 命名元组(namedtuple)

描述:

namedtuple 生成可以通过名称访问字段的元组子类。

操作:

通过字段名或索引访问元素。
_replace(**kwargs):返回一个新的元组实例,并用新值替换指定字段。
_asdict():将命名元组转换为字典。

应用场景:

替代轻量类,用于存储结构化数据,如数据库记录。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)

print(p.x, p.y)  # 11 22

6. 数组(array)

描述:

array 是一种存储相同类型元素的高效数据结构,适用于处理大量数值型数据。

操作:

append(x):在数组末尾添加元素。
extend(iterable):扩展数组。
pop([i]):移除并返回指定位置的元素。
insert(i, x):在指定位置插入元素。

应用场景:

适合大量数值型数据的存储和处理,如图像处理、科学计算。

from array import array

a = array('i', [1, 2, 3, 4])
a.append(5)
print(a)  # array('i', [1, 2, 3, 4, 5])

7. 集合(Set)

描述:

Set 是无序且不重复的元素集合。

操作:

add(x):添加元素。
remove(x):移除元素。
union(other):并集操作。
intersection(other):交集操作。

应用场景:

用于元素去重、快速判断元素是否存在、集合运算等。

s = set([1, 2, 3, 1, 2])
print(s)  # {1, 2, 3}

s.add(4)
print(s)  # {1, 2, 3, 4}

# 并集
s2 = set([3, 4, 5])
print(s.union(s2))  # {1, 2, 3, 4, 5}

8. 优先队列(Priority Queue)

描述:

优先队列是一种每次取出元素时都会按优先级排序的队列,最低优先级的元素首先出列。

操作:

put(item):将元素放入队列。
get():移除并返回优先级最高的元素。
empty():检查队列是否为空。

应用场景:

任务调度、事件处理中的优先级队列。

import heapq

heap = []
heapq.heappush(heap, (1, 'priority 1'))
heapq.heappush(heap, (3, 'priority 3'))
heapq.heappush(heap, (2, 'priority 2'))

print(heapq.heappop(heap))  # (1, 'priority 1')

9. 堆(Heap)

描述:

堆是一种特殊的二叉树,通常用于实现优先队列,支持高效获取最小值或最大值。

操作:

heapify(iterable):将可迭代对象转换为堆。
heappush(heap, item):将元素推入堆。
heappop(heap):弹出并返回最小元素。
heapreplace(heap, item):弹出最小元素并将新元素推入堆中。

应用场景:

优先队列、需要快速访问最小值或最大值的场景。

import heapq

nums = [3, 1, 4, 1, 5, 9]
heapq.heapify(nums)
print(heapq.heappop(nums))  # 1

10. 链表(Linked List)

描述:

链表由节点组成,每个节点包含数据以及指向下一个节点的指针。

操作:

insert(data):在链表头插入数据。
remove(data):移除包含特定数据的节点。
search(data):查找链表中包含特定数据的节点。

应用场景:

需要频繁插入、删除操作,尤其是数据量大时的应用场景。

class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None
    
    def insert(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node
    
    def print_list(self):
        node = self.head
        while node:
            print(node.data, end=" -> ")
            node = node.next

ll = LinkedList()
ll.insert(1)
ll.insert(2)
ll.insert(3)
ll.print_list()  # 输出: 3 -> 2 -> 1 ->

这些数据结构及其操作可以有效地解决不同的编程问题,提高代码的性能和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2152496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器 服务雪崩熔断、限流、降级熔断降级限流 手写实现一个微服务熔断限流器架构设计代码实现整体逻辑ProtectorAspect#aroundMethod(ProceedingJoinPoint)具体实现1、获取接口对…

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误

在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS’ 错误 在 Windows 系统上启动 Vue 项目时,遭遇报错。具体报错信息如下: ‘NODE_OPTIONS‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。这个错误通常意味着 Windows 系统无法识…

速通LLaMA2:《Llama 2: Open Foundation and Fine-Tuned Chat Models》全文解读

文章目录 概览LLaMA和LLaMA2的区别AbstractIntroductionPretrainingFine-tuning1. 概括2、Supervised Fine-Tuning(SFT)3、⭐Reinforcement Learning with Human Feedback(RLHF)🔺总览Training Objectives:…

Redis——redispluspls库——通用命令以及String类型相关接口使用

文章目录 通用命令get,setkeys插入迭代器 expire和ttltype string 类型接口set和getset NX和XXmset 和 mgetgetrange 和 setrangeincr 和 decr 通用命令 get,set void get_set_test(sw::redis::Redis& redis){//bool set(const sw::redis::StringV…

回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现INFO-HKELM向量加权算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-HKELM向量加权算法优化混合核极…

使用Python和Proxy302代理IP高效采集Bing图片

目录 项目背景一、项目准备环境配置 二、爬虫设计与实现爬虫设计思路目标网站分析数据获取流程 代码实现1. 初始化爬虫类(BingImageSpider)2. 创建存储文件夹3. 获取图像链接4. 下载图片5. 使用Proxy302代理IP6. 主运行函数 运行截图 三、总结 项目背景 …

2024/9/21 leetcode 19题 24题

目录 19.删除链表中的倒数第n个结点 题目描述 题目链接 解题思路与代码 24.两两交换链表中的结点 题目描述 题目链接 解题思路与代码 19.删除链表中的倒数第n个结点 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示…

Kyutai开源实时语音对话模型Moshi

新闻 法国人工智能实验室Kyutai在巴黎举行的一次活动上推出了能够进行自然交互的对话式人工智能助手Moshi,并计划将其作为开源技术发布。Kyutai表示,Moshi是首款可公开访问的人工智能助手,可实现实时对话,有别于OpenAI的GPT-4o&a…

mybatis 和 mybatis-plus

mybatis 配置 1.新建MAVEN项目 2.配置mybatis依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

基于YOLOv5s的无人机航拍输电线瓷瓶检测(附数据集与操作步骤)

本文主要内容:详细介绍了无人机航拍输电线瓷瓶检测的整个过程&#xff0c;从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 输电线路绝缘瓷瓶的检测主要依赖人工巡检。巡检人员需携带专业设备&#xff0c;攀…

Typora安装和导入导出

Typora安装和导入导出 文章目录 Typora安装和导入导出前言Typora v1.9.5Typora v1.4.7Pandoc 前言 Typora v1.9是最新版, , Typora v1.4是老版本的, 这两个选择一个即可Pandoc可以导入导出word Typora v1.9.5 Typora v1.9.rar, 提取码&#xff1a;tian按ctrl单击鼠标左键打开…

毕业设计选题:基于ssm+vue+uniapp的捷邻小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大数据实验一: Linux系统安装和使用

一、实验目的 描述Ubuntu的安装过程&#xff1b;使用命令完成Ubuntu中的基础操作&#xff1b; 二、实验平台 操作系统&#xff1a;window系统&#xff1b;内存&#xff1a;4G以上&#xff1b;硬盘&#xff1a;100GB以上&#xff1b;Virtual Box或者VMware&#xff1b;Ubuntu…

如何用1024张显卡训练一个模型

最近看到知乎一个回答&#xff0c;把千卡训练的难度吹上天了。但其实真正用过千卡就会发现也就那么几个点。于是想写一篇文章简单讲讲。 本文将包括几个部分&#xff1a; 首先我们将讨论千卡训练的难题&#xff0c;以及应该在什么时候使用千卡训练&#xff1b; 接着&#xff…

品牌建设是什么?怎么做好品牌建设?

品牌建设&#xff0c;是每个公司品牌形象树立过程中所做的一系列动作&#xff0c;旨在与目标市场建立情感联系&#xff0c;并在竞争激烈的市场中为企业或产品赢得认同和忠诚度。要做好品牌建设&#xff0c;公司首先要明确自己的品牌定位&#xff0c;然后在通过一些品牌建设策略…

Java调用数据库 笔记06 (修改篇)

1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类调用方法进行连接&#xff0c;得到连接对象 DriverManager.getConnection(url, user, password); 其中设置参数&#xff1a; static final String url "jdbc:my…

2024年上海小学生古诗文大会倒计时一个月:做2024官方模拟题

2024年上海市小学生古诗文大会自由参赛的初赛将于10月19日开始&#xff0c;还有不到一个月的时间。 今天好真题继续带着大家来继续做官方2024年小学生古诗文大会的官方模拟题。 【温馨提示】我给每一道题都独家制作了解析&#xff0c;便于孩子理解和熟记题目背后的知识点&…

【python设计模式6】行为型模式1

目录 责任链模式 观察者模式 责任链模式 责任链模式的内容&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。责任链的角色有抽象处理者、…

b2b2c商城系统好用么 多用户商城系统四大盈利模式

商淘云B2B2C商城系统能帮助企业快速搭建企业自己的多用户商城系统&#xff0c;它提供了多种功能&#xff0c;如多商家管理、订单处理、支付模块集成等&#xff0c;适合各种规模的企业。用户界面友好&#xff0c;且支持定制化&#xff0c;能满足不同业务需求。 多用户商城有四大…

【ARM】A64指令介绍及内存屏障和寄存器

A64指令集介绍 ISA : Instruction System Architecture 指令集总结 跳转指令 使用跳转指令直接跳转&#xff0c;跳转指令有跳转指令B&#xff0c;带链接的跳转指令BL &#xff0c;带状态切换的跳转指令BX。 B 跳转指令&#xff0c;跳转到指定的地址执行程序。 BL 带链接的跳…