【Godot4.2】有序和无序列表函数库 - myList

概述

在打印输出或其他地方可能需要构建有序或无序列表。本质就是构造和维护一个纯文本数组。并用格式化文本形式,输出带序号或前缀字符的多行文本。

为此我专门设计了一个类myList,来完成这项任务。

代码

以下是myList类的完整代码:

# ========================================================
# 名称:myList
# 类型:类
# 简介:专用于构造有序和无序列表的类
# 作者:巽星石
# Godot版本:v4.2.2.stable.official [15073afe3]
# 创建时间:202442711:25:40
# 最后修改时间:202442716:26:10
# ========================================================
class_name myListvar _arr:PackedStringArray# 实例化
func _init(list:PackedStringArray = []) -> void:_arr = list# ============================ 增删改查 ============================
# -------------------- 增
# 末尾添加列表项
func append(item:String)  -> void:_arr.append(item)# 末尾添加列表项
func insert(pos:int,item:String)  -> void:_arr.insert(pos,item)# 添加多个列表项
func append_array(items:PackedStringArray)  -> void:_arr.append_array(items)# 填充指定数目的相同列表项
func fill(item:String,count:int)  -> void:_arr.resize(count)_arr.fill(item)
# -------------------- 删
# 清除列表项
func remove(idx:int) -> void:_arr.remove_at(idx)
# 清空列表项
func clear() -> void:_arr.clear()
# -------------------- 改
# 修改列表项的值
func set_item(idx:int,new_val:String) -> void:_arr[idx] = new_val# 修改列表项的位置
func move_to(idx:int,new_pos:int) -> void:var item = _arr[idx]_arr.remove_at(idx)_arr.insert(new_pos if new_pos !=0 else 0,item)
# -------------------- 查
# 获取列表项的值
func get_item(idx:int) ->String:return _arr[idx]# 返回列表项的总数
func get_count() ->int:return _arr.size()
# -------------------- 遍历
# 遍历函数
func for_item(callback:Callable) ->void:for i in range(_arr.size()):callback.callv([_arr[i],i,_arr.size()])
# ============================ 获取列表 ============================
# 返回数组的副本
func get_data() -> PackedStringArray:return _arr.duplicate()# 返回有序列表字符串
# 如果show_zero=true,则以最大项序号的位数,在序号之前填充0
func get_OL_string(show_zero:=false) -> String:var s = ""var fm = "%" + "0%dd" % str(_arr.size()).length() if show_zero else "%d" # 以最大项数的位数补全0for i in range(_arr.size()):s+= fm % [i+1] + ".%s" % [_arr[i]]if i != _arr.size()-1:s+= "\n"return s
# 返回有序列表字符串(可直接用于MArkDown)
func get_OL_markdown() -> String:var s = ""for i in range(_arr.size()):s+= "%d. %s" % [i+1,_arr[i]]if i != _arr.size()-1:s+= "\n"return s# 返回html有序列表字符串
func get_OL_html() -> String:var s = "</li>\n\t<li>".join(_arr)return "%s%s%s" % ["<ol>\n\t<li>",s,"</li>\n</ol>"]# 返回html无序列表字符串
func get_UL_html() -> String:var s = "</li>\n\t<li>".join(_arr)return "%s%s%s" % ["<ul>\n\t<li>",s,"</li>\n</ul>"]# 返回无序列表字符串
func get_UL_string(symbol:String = "-") -> String:var s = ""for i in range(_arr.size()):s+= ("%s %s" % [symbol,_arr[i]])if i != _arr.size()-1:s+= "\n"return s

创建实例

我们可以用new()来创建myList实例:

var list = myList.new()   # 创建实例

或者在new()中传入一个PackedStringArray作为初始值:

var list = myList.new(["条目1","条目2","条目3","条目4"])   # 创建实例

添加列表项

除了实例化时直接传入一个字符串数组之外,还可以使用:

  • append():在列表末尾添加一个列表项
  • append_array():以字符串数组形式,在列表末尾批量添加列表项
  • fill():用指定个数的相同列表项填充列表
  • insert():在指定位置插入新的列表项

末尾追加

var list = myList.new(["条目1","条目2","条目3","条目4",])   # 创建实例
list.append("条目5")                           # 末尾追加
list.append_array(["条目6","条目7","条目8",])   # 末尾追加多项

整体填充

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充

在指定位置插入

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
ist.insert(3,"inset插入的列表项")   # 在指定位置插入

对应的有序列表:

1.这是一个无序列表项
2.这是一个无序列表项
3.这是一个无序列表项
4.inset插入的列表项
5.这是一个无序列表项
6.这是一个无序列表项
7.这是一个无序列表项
8.这是一个无序列表项
9.这是一个无序列表项

修改列表项

  • set_item():修改指定项的值
  • move_to():修改指定项的位置

修改指定项的值

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
list.set_item(3,"修改后的值")       # 修改指定位置列表项的值

对应的有序列表:

1.这是一个无序列表项
2.这是一个无序列表项
3.这是一个无序列表项
4.修改后的值
5.这是一个无序列表项
6.这是一个无序列表项
7.这是一个无序列表项
8.这是一个无序列表项

移动列表项

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
list.set_item(3,"修改后的值")   # 修改指定位置列表项的值
list.move_to(3,6)            # 修改列表项位置

对应的有序列表:

1.这是一个无序列表项
2.这是一个无序列表项
3.这是一个无序列表项
4.这是一个无序列表项
5.这是一个无序列表项
6.这是一个无序列表项
7.修改后的值
8.这是一个无序列表项

获取列表项的值

  • get_item():获取指定位置列表项的值
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
print(list.get_item(0))            # 获取指定位置列表项的值

输出:

这是一个无序列表项

获取总的列表项数目

  • get_count():获取总的列表项数目
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
print(list.get_count())            # 获取总的列表项数目

输出:

8

遍历函数

  • for_item():遍历函数,可以传入一个匿名函数作为回调,包含item,index,count三个参数。
  • 可以用于快速遍历列表项,执行某些操作
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
# 使用遍历函数
list.for_item(func(item,index,count):printt(item,index,count)
)

输出:

这是一个无序列表项	0	8
这是一个无序列表项	1	8
这是一个无序列表项	2	8
这是一个无序列表项	3	8
这是一个无序列表项	4	8
这是一个无序列表项	5	8
这是一个无序列表项	6	8
这是一个无序列表项	7	8

获取列表数据

  • get_data():返回内部数组的副本。
var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充
print(list.get_data())             # 获取列表数据

输出:

["这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项", "这是一个无序列表项"]

有序列表

  • get_OL_string():返回纯字符串形式的有序列表,无法被MarkDown编辑器识别
  • get_OL_markdown():返回可以被MarkDown编辑器识别的纯字符串形式有序列表
  • get_OL_html():返回HTML形式的有序列表

创建myList实例:

var list = myList.new(["条目1","条目2","条目3","条目4",])   # 创建实例
list.append("条目5")      # 末尾追加
list.append_array(["条目6","条目7","条目8",])   # 末尾追加多项

普通有序列表字符串

print(list.get_OL_string())   # 打印普通有序列表

输出:

1.条目1
2.条目2
3.条目3
4.条目4
5.条目5
6.条目6
7.条目7
8.条目8

get_OL_string()有一个参数show_zero,默认为false,如果设为true,则会自动在序号前补上0,序号的总位数取决于最大项序号的位数。

var list = myList.new()              # 创建实例
list.fill("这是一个有序列表项",100)    # 填充
print(list.get_OL_string(true))   # 获取并打印有序列表

输出:

001.这是一个有序列表项
002.这是一个有序列表项
003.这是一个有序列表项
004.这是一个有序列表项
005.这是一个有序列表项
006.这是一个有序列表项
007.这是一个有序列表项
008.这是一个有序列表项
009.这是一个有序列表项
010.这是一个有序列表项
011.这是一个有序列表项
...
098.这是一个有序列表项
099.这是一个有序列表项
100.这是一个有序列表项

可以被MarkDown编辑器识别的有序列表字符串

print(list.get_OL_markdown())   # 打印可以被MarkDown编辑器识别的有序列表

输出:

1. 条目1
2. 条目2
3. 条目3
4. 条目4
5. 条目5
6. 条目6
7. 条目7
8. 条目8

粘贴到Typora中会被自动识别和转化为有序列表:
image.png

HTML形式有序列表

print(list.get_OL_html())

输出:

<ol><li>条目1</li><li>条目2</li><li>条目3</li><li>条目4</li><li>条目5</li><li>条目6</li><li>条目7</li><li>条目8</li>
</ol>

网页浏览器中效果:
image.png

无序列表

  • get_UL_string():返回纯字符串形式的有序列表,可以被MarkDown编辑器识别
  • get_UL_html():返回HTML形式的有序列表

创建并填充一个无序列表:

var list = myList.new()            # 创建实例
list.fill("这是一个无序列表项",8)    # 填充

普通无序列表字符串

print(list.get_UL_string())  # 获取并打印无序列表

输出:

- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项
- 这是一个无序列表项

起始,这种形式也可以直接被MarkDown编辑器识别为无序列表:
image.png

显示自定义符号

  • get_UL_string()有一个参数,可以传入自定义的列表符号:
print(list.get_UL_string("*"))   # 自定义无序列表符号
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
* 这是一个无序列表项
print(list.get_UL_string("□"))   # 自定义无序列表符号
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项
□ 这是一个无序列表项

HTML形式无序列表

print(list.get_UL_html())

输出:

<ul><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li><li>这是一个无序列表项</li>
</ul>

代码技巧总结

获取数字的位数

对于整数,通过将其转化为字符串,获取长度来获取位数:

print(str(32).length()) # 2

对于浮点数,可以采取类似的方法:

print(str(10.25).length()) # 5

如果需要不包含小数点的位数,早上面的值之上减1就可以了:

print(str(10.25).length()-1) # 4

判断数字是浮点数还是整数

通过判断是否有.,可以判断数字是不是小数:

print(true if str(10.25).find(".") != -1 else false) # true
print(true if str(100).find(".") != -1 else false)   # false

或者更简单的用is:

print(num is float)   # 判断数字是不是浮点数
print(num is int)     # 判断数字是不是整数

单独获取浮点数的整数和小数部分,及其位数

我们可以用字符串分割来获取整数部分和小数部分的数字:

print(str(10.25).split(".")[0]) # "10"  浮点数的整数部分
print(str(10.25).split(".")[0].length()) # 2 浮点数的整数部分的位数
print(str(10.25).split(".")[1]) # "25" 浮点数的小数部分位数
print(str(10.25).split(".")[1].length()) # 2 浮点数的小数部分位数
print("0.%s" % str(10.25).split(".")[1]) # "0.25" 浮点数的完整小数部分

构造复杂的多重格式化字符串

var fm = "%" + "0%dd" % str(32).length()
print(fm % 1) # 01
  • str(32).length()获取整数32的位数
  • "%" + "0%dd" % str(32).length(),首先将替换"0%dd"中的%d,变为"02d",然后加上之前的%,构成格式化字符串"%02d"

在整数末尾补0

  • "%04d" % 123,返回0123
  • "%0-4d" % 123,返回1230,-实现了在右侧,也就是末尾补0的效果
print("%0-4d" % 123) # 1230

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

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

相关文章

SQL Sever无法连接服务器

SQL Sever无法连接服务器&#xff0c;报错证书链是由不受信任的颁发机构颁发的 解决方法&#xff1a;不用ssl方式连接 1、点击弹框中按钮“选项” 2、连接安全加密选择可选 3、不勾选“信任服务器证书” 4、点击“连接”&#xff0c;可连接成功

python安卓自动化pyaibote实践------学习通自动刷课

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文是一个完成一个自动播放课程&#xff0c;避免人为频繁点击脚本的构思与源码。 加油&#xff01;为实现全部电脑自动化办公而奋斗&#xff01; 为实现摆烂躺平的人生而奋斗&#xff01;&#xff01;&#xff…

视觉语言模型详解

视觉语言模型可以同时从图像和文本中学习&#xff0c;因此可用于视觉问答、图像描述等多种任务。本文&#xff0c;我们将带大家一览视觉语言模型领域: 作个概述、了解其工作原理、搞清楚如何找到真命天“模”、如何对其进行推理以及如何使用最新版的 trl 轻松对其进行微调。 什…

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…

报错“Install Js dependencies failed”【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【报错“Install Js dependencies failed”】的问题。 报错如下 问题描述 …

【C++语法练习】计算梯形的面积

题目链接&#xff1a;https://www.starrycoding.com/problem/158 题目描述 已知一个梯形的上底 a a a&#xff0c;下底 b b b和高 h h h&#xff0c;请求出它的面积&#xff08;结果保留两位小数&#xff09;。 输入格式 第一行一个整数 T T T表示测试用例个数。 ( 1 ≤ T …

Linux 的静态库和动态库

本文目录 一、静态库1. 创建静态库2. 静态库的使用 二、动态库1. 为什么要引入动态库呢&#xff1f;2. 创建动态库3. 动态库的使用4. 查看可执行文件依赖的动态库 一、静态库 在编译程序的链接阶段&#xff0c;会将源码汇编生成的目标文件.o与引用到的库&#xff08;包括静态库…

关于用户体验和设计思维

介绍 要开发有效的原型并为用户提供出色的体验&#xff0c;了解用户体验 (UX) 和设计思维的原则至关重要。 用户体验是用户与产品、服务或系统交互并获得相应体验的过程。 设计思维是一种解决问题的方法&#xff0c;侧重于创新和创造。 在启动期实现用户体验和设计思维时&#…

大数据分析与内存计算学习笔记

一、Scala编程初级实践 1.计算级数&#xff1a; 请用脚本的方式编程计算并输出下列级数的前n项之和Sn&#xff0c;直到Sn刚好大于或等于q为止&#xff0c;其中q为大于0的整数&#xff0c;其值通过键盘输入。&#xff08;不使用脚本执行方式可写Java代码转换成Scala代码执行&a…

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别&#xff0c;你真的知道吗&#xff1f; 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要环节&#xff0c;显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要…

二叉树详细介绍与代码生成遍历

目录 树的概念及其结构树的构造——代码表示 二叉树概念及介绍二叉树的存储结构二叉树的顺序结构二叉树的链式结构链表的代码展示堆的基本概念和结构堆的代码体现二叉树生成二叉树遍历 四种不同遍历方式——代码展示 树的概念及其结构 要了解二叉树&#xff0c;那么首要的就是…

Spark Structured Streaming 分流或双写多表 / 多数据源(Multi Sinks / Writes)

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

探索潜力:中心化交易所平台币的对比分析

核心观点 平台币在过去一年里表现差异显著&#xff1a; 在过去的一年里&#xff0c;只有少数几个平台币如BMX、BGB和MX的涨幅超过了100%。相比之下&#xff0c;由于市值较高&#xff0c;BNB和OKB的涨幅相对较低。 回购和销毁机制在平台币价值中起决定性作用&#xff1a; 像M…

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B>A>C&#xff0c;开放度&#xff1a;AB<C。 以下为A-C题选题建议及初步分析&#xff1a; A题&#xff1a;钢板最优切割路径问题 l 难度评估&#xff1a;中等难度。涉及数学建模和优化算法&#xff0c;需要设计最优的…

前后端数据加密代码实战(vue3.4+springboot 2.7.18)

简述&#xff1a; 文章主要讲述了在vue3与springboot交互数据的个人使用的一个加密形式 SHA256不可逆加密AES对称加密RSA非对称加密 加密算法就不带大家深入了&#xff0c;对于它的使用文章中有明确的案例 数据加密的大概流程为&#xff1a;&#xff08;有更优秀的方案可以…

Springboot+Vue项目-基于Java+MySQL的入校申报审批系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Python用KNN处理缺失值(4月30-5月1日)

首先试验KNN的简单示例代码 #方法3&#xff1a; # 本论文拟采用的填充缺失值的方法为KNN: import pandas as pd from sklearn.impute import KNNImputer #创建一个包含缺失值的数据集 data_KNN{第一列:[1,2,None,4,5],第二列:[3,None,5,7,9],第三列:[2,4,6,None,10] } dfpd.Da…

有哪些ai自动生成图片软件?AI绘画工具推荐

AI绘画工具是近年来快速发展的一种创新技术&#xff0c;它可以通过算法和机器学习技术来自动生成图片。那么又有有哪些ai自动生成图片软件呢&#xff1f;下面是小编给大家的AI绘画工具推荐。 一、爱制作AI 爱制作AI是一款多功能的人工智能助手&#xff0c;具备AI问答、AI写作、…

【FPGA】优化设计指南(一):设计原则

目录 避免采用不可综合的语句设计时采用同步的时钟组合逻辑与毛刺异步复位与同步复位动态分析与静态分析功能流水线时序违例乒乓操作面积和速度的平衡避免采用不可综合的语句 1.#1000延时语句 2.除法运算/,除非除数为2的整次幂 3.实数类型不可综合(real) 4.综上,使用可综合…

STM32进入睡眠模式的方法

#STM32进入睡眠模式的方法 今天学习了如何控制STM32进入睡眠模式&#xff0c;进入睡眠模式的好处就是省电&#xff0c;今天学习的只是浅度睡眠&#xff0c;通过中断就能唤醒。比如单片机在那一放&#xff0c;也许好几天好几个月都不用一次&#xff0c;整天的在那空跑while循环…