python 首尾相连的数据结构

news/2024/11/20 9:22:55/文章来源:https://www.cnblogs.com/daizichuan/p/18556085

背景:想找找有没有数据是循环到末尾之后,再从头开始循环的数据。印象中,列表循环和取模可以实现。

1. 使用 itertools.cycle 模拟循环

itertools.cycle 是 Python 内置模块 itertools 中的一个工具,它会对一个可迭代对象进行无限循环:

示例代码

python
from itertools import cycle data = [1, 2, 3, 4] cyclic_iterator = cycle(data) # 循环取数据 for _ in range(10): # 示例:取 10 次数据 print(next(cyclic_iterator))

输出

 
1 2 3 4 1 2 3 4 1 2
  • 优点:不用手动实现循环逻辑,简单高效。
  • 缺点:它是一个迭代器,只能通过 next() 一次取一个值,无法随机访问。

2. 使用取模操作实现循环

如果需要对固定大小的列表进行循环,可以结合索引和取模运算手动实现:

示例代码

python
data = [1, 2, 3, 4] index = 0 # 模拟循环 for _ in range(10): # 示例:取 10 次数据 print(data[index]) index = (index + 1) % len(data) # 取模实现循环

输出

 
1 2 3 4 1 2 3 4 1 2
  • 优点:可以随机访问任何索引位置。
  • 缺点:需要手动维护索引。

3. 使用自定义类实现循环数据结构

如果需要更加灵活的功能(如增删元素、循环遍历等),可以实现一个自定义的数据结构:

示例代码

python
class CircularList: def __init__(self, data): self.data = data self.index = 0 def next(self): if not self.data: raise IndexError("空列表无法循环!") value = self.data[self.index] self.index = (self.index + 1) % len(self.data) # 取模实现循环 return value def add(self, value): """向列表中添加元素""" self.data.append(value) def remove(self, value): """移除指定元素""" self.data.remove(value) self.index %= len(self.data) # 确保索引合法 # 测试 clist = CircularList([1, 2, 3, 4]) for _ in range(10): print(clist.next()) # 循环输出数据

输出

 
1 2 3 4 1 2 3 4 1 2
  • 优点:可以动态增删元素,同时支持循环操作。
  • 缺点:需要额外实现功能逻辑。

4. 双向循环队列(使用 collections.deque

如果需要支持双向遍历(即前进和后退),可以使用 collections.deque 来实现:

示例代码

python
from collections import deque class CircularDeque: def __init__(self, data): self.data = deque(data) def next(self): value = self.data.popleft() # 从左侧取值 self.data.append(value) # 把取出的值重新放到右侧 return value def prev(self): value = self.data.pop() # 从右侧取值 self.data.appendleft(value) # 把取出的值重新放到左侧 return value # 测试 cdeque = CircularDeque([1, 2, 3, 4]) for _ in range(4): # 向前循环 print("Next:", cdeque.next()) for _ in range(4): # 向后循环 print("Prev:", cdeque.prev())

输出

makefile
Next: 1 Next: 2 Next: 3 Next: 4 Prev: 4 Prev: 3 Prev: 2 Prev: 1
  • 优点:支持前进和后退,灵活高效。
  • 缺点:需要引入 collections.deque

总结

  1. 简单循环:推荐使用 itertools.cycle,适合读取数据但不能修改。
  2. 随机访问:使用取模操作,可以快速实现循环。
  3. 动态增删功能:实现自定义 CircularList 类。
  4. 双向遍历:使用 collections.deque 实现循环队列。

根据你的具体需求选择最合适的方法即可!

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验 20:备忘录模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解备忘录模式的动机,掌握该模式的结构; 2、能够利用备忘录模式解决实际问题。[实验任务一]:多次撤销 改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合…

实验 21:观察者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解观察者模式的动机,掌握该模式的结构; 2、能够利用观察者模式解决实际问题。[实验任务一]:股票提醒 当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下…

MaskLLM:英伟达出品,用于大模型的可学习`N:M`稀疏化 | NeurIPS24

来源:晓飞的算法工程笔记 公众号,转载请注明出处论文: MaskLLM: Learnable Semi-Structured Sparsity for Large Language Models论文地址:https://arxiv.org/abs/2409.17481 论文代码:https://github.com/NVlabs/MaskLLM创新性提出一种可学习的LLM半结构化剪枝方法MaskLLM…

Codeforces 1145 题目分析

本文将分析 Codeforces 1145 (April Fools Day Contest 2019)。 题目分析 A 题目描述:使用“灭霸排序”算法可以得到的最长子串的长度。 解法:暴力。 B 题目描述:输入一个整数 \(\in [1,99]\),若它的英文形式含有 knba 四个字母输出 NO 否则输出 YES。 解法:打表。 C 题目…

3.2点对点ppp

001ppp协议特点 ppp协议能承载不同网络层分组,ip数据报里有其他网络层协议存在。 能在多种类型的链路上运行 和广播方式相比,需要一个网络地址的协商,传送前有个协商过程,确认资源。地址002ppp协议组成 将ip数据报封装到串行链路的方法 链路控制协议LCP--建立链路,身份验证…

.net8报HTTP Error 500.30 - ASP.NET Core app failed to start

.net8调试正常,发布到IIS报HTTP Error 500.30 - ASP.NET Core app failed to start。 解决办法: 停止IIS站点,运行发布项目的“XXX.exe”,在运行窗口就可以看到具体的错误信息。 在根据具体错误信息解决。

设计和训练人工智能模型的意义是什么?

前一篇:《人工智能模型训练技术,正则化!》 序言:人工智能模型的真正价值在于其实际应用,而不仅仅停留在理论阶段。本节将通过一个简单而常见的应用场景,展示如何将前面几节所设计和训练的模型应用于实际问题。我们将使用训练好的模型对句子进行分类,具体来说,识别社交平…

【分享】数据传输新挑战:内外网文件如何实现安全高效摆渡?

随着信息化的不断深入,越来越多的数据被电子化,这使得数据安全问题变得更加突出。全球42%的企业在过去一年中至少经历过一次数据泄露事故,30%的企业IT人员在数据泄露事故中被开除,50%的企业IT认为文件管控难度大、成本高。 为了保护核心数据,大部分企业都实施了内外网隔离…

画图-利用画图工具修改聊天记录时间

1、用Windows自带的画图工具 打开要修改的图片 选择“矩形”用矩形选中要修改的时间即可对其进行 移动 或者覆盖的操作

Redis中常见的数据类型及其应用场景

五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String、List等类型进行存储。各数据类型介绍:Redis数据类型对应的底层数据结构String 类型的应用场景 常用命令存放键值:set key value [EX seconds] …

dotnet 9 WPF 项目禁用 IncludePackageReferencesDuringMarkupCompilation 导致源代码包 XAML 构建失败

本文记录在 dotnet 6 时通过禁用 IncludePackageReferencesDuringMarkupCompilation 解决源代码冲突问题时,在 dotnet 9 将因此导致 XAML 构建生成的 g.cs 文件包含的 XAML 只记录相对文件路径,从而导致构建不通过在 WPF 修复 dotnet 6 与源代码包冲突 这篇博客里面和大家介绍…

WPF 被 灵格斯翻译官 取词带崩

本文记录 灵格斯翻译官 翻译软件带崩 WPF 程序问题灵格斯翻译官 : http://www.lingoes.cn/ 只要有 WPF 的 ToolTip 或者其他小窗口,执行鼠标拖动过程中,就可能被带崩 我这次没有捞 dump 文件,就只记录此问题 退出 灵格斯翻译官 进程则没有此问题 我从事件管理器也看到 WPS …