玩转python:通俗易懂掌握高级数据结构-collections模块之UserList

news/2025/3/20 18:05:32/
引言

UserList是Python中collections模块提供的一个强大工具,它是list的封装类,允许用户自定义列表的行为。通过继承UserList,开发者可以轻松扩展列表的功能,实现自定义的列表逻辑。本文将详细介绍UserList的关键用法和特性,并通过8个丰富的案例帮助大家掌握其应用。


关键用法和特性表格
特性/方法描述
自定义列表行为继承UserList可以自定义列表的行为,如添加、删除、查找等。
封装原始列表UserList内部封装了一个列表对象,可以通过data属性访问。
初始化使用UserList(iterable)创建,支持传入可迭代对象。
data返回内部封装的列表对象。
支持所有列表操作支持所有列表操作,如索引、切片、追加、插入、删除等。
扩展功能可以通过重写方法实现自定义功能,如验证元素、记录操作日志等。

1. UserList的概念

UserListcollections模块中的一个类,它是list的封装类。它的主要特点是:

  • 自定义列表行为:通过继承UserList,可以自定义列表的行为。
  • 封装原始列表UserList内部封装了一个列表对象,可以通过data属性访问。
  • 高效性能:与普通列表相比,UserList在自定义功能的同时性能依然高效。

2. UserList的用法

2.1 创建UserList
python">from collections import UserList# 创建一个空的UserList
ul = UserList()
print(ul)  # 输出: []# 从列表创建UserList
ul = UserList([1, 2, 3])
print(ul)  # 输出: [1, 2, 3]
2.2 访问元素
python"># 访问元素
print(ul[0])  # 输出: 1
print(ul[-1])  # 输出: 3
2.3 修改元素
python"># 修改元素
ul[0] = 10
print(ul)  # 输出: [10, 2, 3]

3. UserList的常见方法

3.1 data:访问内部列表
python"># 访问内部列表
print(ul.data)  # 输出: [10, 2, 3]
3.2 自定义列表行为
python"># 自定义列表行为
class MyList(UserList):def append(self, item):if not isinstance(item, int):raise TypeError("Item must be an integer")super().append(item)ml = MyList([1, 2, 3])
ml.append(4)  # 正常
ml.append('a')  # 报错: TypeError

4. UserList的8个应用案例

案例1:验证元素类型

场景:自定义一个列表,确保所有元素都是整数。

python">class IntList(UserList):def append(self, item):if not isinstance(item, int):raise TypeError("Item must be an integer")super().append(item)# 使用IntList
il = IntList([1, 2, 3])
il.append(4)  # 正常
il.append('a')  # 报错: TypeError
案例2:记录操作日志

场景:自定义一个列表,记录所有添加和删除操作。

python">class LoggingList(UserList):def append(self, item):print(f"添加元素: {item}")super().append(item)def remove(self, item):print(f"删除元素: {item}")super().remove(item)# 使用LoggingList
ll = LoggingList([1, 2, 3])
ll.append(4)  # 输出: 添加元素: 4
ll.remove(2)  # 输出: 删除元素: 2
案例3:限制列表长度

场景:自定义一个列表,限制其最大长度。

python">class LimitedList(UserList):def __init__(self, maxlen, *args, **kwargs):super().__init__(*args, **kwargs)self.maxlen = maxlendef append(self, item):if len(self) >= self.maxlen:self.pop(0)super().append(item)# 使用LimitedList
ll = LimitedList(3, [1, 2, 3])
ll.append(4)  # 列表变为 [2, 3, 4]
案例4:实现栈

场景:使用UserList实现一个栈(后进先出)。

python">class Stack(UserList):def push(self, item):self.append(item)def pop(self):return super().pop()# 使用Stack
s = Stack()
s.push(1)
s.push(2)
print(s.pop())  # 输出: 2
案例5:实现队列

场景:使用UserList实现一个队列(先进先出)。

python">class Queue(UserList):def enqueue(self, item):self.append(item)def dequeue(self):return self.pop(0)# 使用Queue
q = Queue()
q.enqueue(1)
q.enqueue(2)
print(q.dequeue())  # 输出: 1
案例6:统计元素频率

场景:自定义一个列表,统计每个元素的出现频率。

python">class FrequencyList(UserList):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.freq = {}def append(self, item):super().append(item)self.freq[item] = self.freq.get(item, 0) + 1# 使用FrequencyList
fl = FrequencyList()
fl.append(1)
fl.append(2)
fl.append(1)
print(fl.freq)  # 输出: {1: 2, 2: 1}
案例7:实现优先级列表

场景:自定义一个列表,按优先级插入元素。

python">class PriorityList(UserList):def insert_priority(self, item, priority):for i, (p, _) in enumerate(self):if priority > p:self.insert(i, (priority, item))returnself.append((priority, item))# 使用PriorityList
pl = PriorityList()
pl.insert_priority('task1', 1)
pl.insert_priority('task2', 3)
pl.insert_priority('task3', 2)
print(pl)  # 输出: [(3, 'task2'), (2, 'task3'), (1, 'task1')]
案例8:实现去重列表

场景:自定义一个列表,确保元素不重复。

python">class UniqueList(UserList):def append(self, item):if item not in self:super().append(item)# 使用UniqueList
ul = UniqueList([1, 2, 2, 3])
ul.append(3)  # 列表不变
ul.append(4)  # 列表变为 [1, 2, 3, 4]

总结

UserList是Python中一个非常实用的工具,能够帮助开发者轻松扩展列表的功能。通过本文的详细讲解和8个实际案例,大家可以快速掌握UserList的使用方法,并在实际项目中灵活应用。无论是验证元素类型、记录操作日志,还是实现栈和队列,UserList都能轻松应对!


http://www.ppmy.cn/news/1580648.html

相关文章

使用 GetX 实现状态管理:同一页面和不同页面之间的数据变化

使用 GetX 实现状态管理:同一页面和不同页面之间的数据变化 在 Flutter 开发中,GetX 是一个轻量级、高性能的状态管理工具,能够轻松实现同一页面的数据变化和不同页面之间的数据共享与同步。本文将详细介绍如何使用 GetX 实现这两种场景的状…

Redis--渐进式遍历

目录 一、引言 二、介绍 三、命令 四、总结 一、引言 本篇文章将介绍Redis中的渐进式遍历 二、介绍 一般使用keys * 来获取所有的key,但这样的操作如果数据量很大的时候,会将服务器给卡死,所以通过渐进式遍历,就会避免这个问题…

Ubuntu 20.04 + mysql 8 默认密码问题

问题描述: Ubuntu20.04安装完mysql8之后无法登录,不知道密码 mysql -u root 原因: 系统默认自动配置好了用户和强密码 解决办法: sudo cat /etc/mysql/debian.cnf查看该文件 利用上面的user 和 passwd 即可登录mysql mysql …

上海高考解析几何

解析几何的核心思想。 1. 核心分析方法: 自由度引入 方程组中, n n n 个未知数需要 n n n 个等式来解出具体的值。 自由度 性质 一个未知数带来一个自由度,一个等式条件减少一个自由度(减少自由度的方式为消元)。…

2024年数维杯数学建模A题多源机会信号建模与导航分析解题全过程论文及程序

2024年数维杯数学建模 A题 多源机会信号建模与导航分析 原题再现: (一)问题背景   尽管全球卫星定位系统下的定位导航技术已成熟,但考虑到室内、隧道、建筑密集区等复杂环境或全球卫星定位系统被毁失灵等突发场景,…

优化 Java 数据结构选择与使用,提升程序性能与可维护性

引言 在软件开发中,数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java 作为一门广泛使用的编程语言,提供了丰富的内置数据结构,如数组、链表、栈、队列、树、图以及集合框架中的各种接口实现(如 List…

机器学习简史

机器学习作为人工智能的核心技术,其发展历程既是计算机科学的革命史,也是人类对智能本质探索的缩影。从20世纪中叶的萌芽到当今深度学习的繁荣,机器学习经历了数次技术范式的转变,见证了符号主义与连接主义的学派之争,…

【从零开始学习计算机科学】信息安全(七)网络攻击

【从零开始学习计算机科学】信息安全(七)网络攻击 网络攻击系统漏洞扫描技术系统漏洞分类漏洞扫描概述漏洞扫描系统分类扫描内容扫描技术端口扫描工具网络攻击概述网络攻击分类网络攻击的手段口令攻击漏洞攻击IP/TCP 欺骗攻击ARP欺骗攻击缓冲区溢出攻击拒绝服务攻击(DOS)碎…