当前位置: 首页 > article >正文

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

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.kler.cn/news/313132.html

相关文章:

  • MySQL高阶1892-页面推荐2
  • 数据结构—(java)反射,枚举,lambda表达式
  • JS获取URL中的某个参数值
  • ONNX Runtime学习之InferenceSession模块
  • go的结构体、方法、接口
  • 【Linux】线程(第十六篇)
  • Java——认识String类
  • element-ui多个消息提示只显示最后一个
  • PromQl语句
  • 用Go语言构建健壮的并发系统:深入理解错误传播与处理
  • SpringDataJpa自关联映射时出现StackOverflowError
  • 灵当CRM系统index.php存在SQL注入漏洞
  • Amoco:一款针对二进制源码的安全分析工具
  • 2024华为杯研赛D题保姆级教程思路分析+教程
  • CDA Level 1 业务数据分析
  • vscode 配置rust格式化的正确方法
  • 【JS】path的使用说明
  • 【软件基础知识】什么是 API,详细解读
  • Zookeeper 3.8.4 安装和参数解析
  • VSCode开发ros程序无法智能提示的解决方法(一)
  • AN7563PT数据手册学习笔记1
  • Java 音视频处理详解
  • 边缘计算网关:连接中心计算与边缘设备的重要桥梁-天拓四方
  • 基于python+django+vue的二手电子设备交易平台
  • PMP--二模--解题--41-50
  • linux如何对c++进行内存分析
  • 总结
  • 低代码开发:助力制造业数字化高质量发展
  • npm的作用域介绍
  • 解决CodeBlocks中的界面wxSmith界面无法打开问题?