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

news2025/4/9 2:01:06

概述

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

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

代码

以下是myList类的完整代码:

# ========================================================
# 名称:myList
# 类型:类
# 简介:专用于构造有序和无序列表的类
# 作者:巽星石
# Godot版本:v4.2.2.stable.official [15073afe3]
# 创建时间:202442711:25:40
# 最后修改时间:202442716:26:10
# ========================================================
class_name myList

var _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" # 以最大项数的位数补全0
	for 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.coloradmin.cn/o/1629254.html

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

相关文章

Android 设置头像 - 相册拍照

Android开发在个人信息管理中&#xff0c;如果设置头像&#xff0c;一般都提供了从相册选择和拍照两种方式。下午将针对设置用户头像相册和拍照两种方式的具体实现进行详细说明。 在实际实现过程中需要使用到权限管理&#xff0c;新版本的Android需要动态申请权限&#xff0c;权…

【JAVA】一文掌握Java并发编程

Java 开发中&#xff0c;并发编程属于相当重要的一个知识点&#xff0c;可以说&#xff0c;Java 的并发能力&#xff0c;是成就今日 Java 地位的因素之一。Java 的并发编程由浅入深实质上是包含 Java&#xff08;API&#xff09;层、JVM&#xff08;虚拟机&#xff09;层、内核…

Mac下使用homebrew管理多版本mysql同时启动

Mac下使用homebrew管理多版本mysql同时启动 思路 给每个版本分配不同的数据目录和配置文件即可 本文尝试了使用 brew 安装管理多个MySQL版本&#xff0c;同时运行、直接切换 安装 如果已有数据文件请自行备份以及使用 安装 mysql 5.7 brew install mysql5.7在 /opt/home…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

C语言编译的优化等级应该选哪个?O0、O1、O2还是O3

在使用IDE开发STM32程序时&#xff0c;IDE一般都会提供优化等级设置的选项&#xff0c;例如下图中KEIL软件优化等级的设置。 从上图中也可以看出&#xff0c;设置不同的优化等级&#xff0c;实际上是修改了编译器的编译参数。这个编译器是由ARM公司提供的C/C编译器armclang或者…

opencv4.8 系列一环境搭搭建

open 运行环境&#xff1a; vs2017 下载地址&#xff1a;https://www.123pan.com/s/cVyRVv-ydPWh.html 一&#xff1a;新建项目 二&#xff1a;核心代码&#xff1a; 在这里插入代码片 #include<opencv2/opencv.hpp>int main(int argc,char** argv) {cv::Mat src cv…

【软考高项】二十六、范围管理基础内容

一、管理基础 产品范围和项目范围 产品范围强调结果&#xff0c;项目范围强调结果 管理的新实践 &#xff1a;需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收…

ptyhon画图显示中文

import matplotlib.pyplot as plt import matplotlib# 设置中文字体 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[font.family]sans-serifplt.plot([1, 2, 3, 4]) plt.xlabel(这是x轴) plt.ylabel(这是y轴) plt.title(这是标题) plt.show()用这个代码…

anaconda安装python 3.8环境

打开anaconda命令行窗口 在命令行窗口中&#xff0c;输入命令&#xff1a;conda create -n py38 python3.8 执行命令后&#xff0c;显示conda版本、安装路径和安装的包 然后提醒是否安装&#xff0c;输入y 等待安装完成。然后进入python3.8&#xff0c;执行命令&#xff1a;con…

收藏:什么是协程的通俗解析

不错的视频&#xff1a;到底该怎么理解协程&#xff1f;_哔哩哔哩_bilibili 重点的要点&#xff1a; 比如这个函数&#xff1a; python中&#xff0c;使用yield关键字来做协程&#xff0c;就是暂停可以去执行其他东西&#xff0c;然后其他东西执行完后&#xff0c;继续执行yiel…

抓包理解协议

用的Wireshark 抓包 1.抓包网卡选择 - WLAN 无线网卡&#xff0c;其他是本地虚拟机的网卡 这里分别是开始捕获、停止捕获、重新捕获、网卡选择&#xff0c;下面是可以过滤选择 过滤tcp包 3次握手&#xff1a; source是源地址&#xff0c; destination是目标地址&#xff0c;in…

Mysql用语句创建表/插入列【示例】

一、 创建表 COMMENT表示字段或列的注释 -- 新建student表 CREATE TABLE student (id BIGINT NOT NULL COMMENT 学生id, enroll_date DATE NOT NULL COMMENT 注册时间, NAME VARCHAR(18) DEFAULT NOT NULL COMMENT 学生姓名, deal_flag TINYINT(1) DEFAULT 0 NOT NULL COMM…

创新入门|从点击到转化:AI个性化登陆页助力潜在客户转化

在数字营销的竞争格局中&#xff0c;采用先进技术对于旨在区分自己并吸引受众的企业至关重要。人工智能 &#xff08;AI&#xff09; 成为一项关键技术&#xff0c;尤其是在制作个性化登录页面的艺术方面。这些页面不仅仅是品牌与其潜在客户之间的第一个接触点;它们是吸引兴趣、…

vue-admin-template项目实现中英文切换

实现效果&#xff1a; 1.安装 *注意版本号 npm install vue-i18n8.24.5 -S2.新建文件夹 在src目录下新建lang文件夹&#xff0c;里面有3个文件 // index.js import Vue from vue import VueI18n from vue-i18n import Cookies from js-cookie import elementEnLocale fr…

Redis 服务等过期策略和内存淘汰策略解析

redis服务是基于内存运行的&#xff0c;所以很多数据都存放在内存中&#xff0c;但是内存又不是无限的&#xff0c;所以redis就引出了key的过期和淘汰策略。 一、Redis的过期策略&#xff1a; 我们在set key的时候&#xff0c;可以给它设置一个过期时间&#xff0c;比如expire …

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【06】JAVASE-数组讲解【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

华为MRS服务使用记录

背景&#xff1a;公司的业务需求是使用华为的这一套成品来进行开发&#xff0c;使用中发现&#xff0c;这个产品跟原生的Hadoop的那一套的使用&#xff0c;还是有很大的区别的&#xff0c;现记录一下&#xff0c;避免以后忘了 一、原始代码的下载 下载地址&#xff1a;MRS样例…

使用Umbrello学习工厂模式

工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口&#xff0c; 或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时&#xff0c;仅仅需要添加一个具体对象以及一个具体工厂对 象&#xff0c;原有工厂对象不需要进行任何修改&#xff0c;也不…

Go语言中有哪些常见的编码规范和最佳实践?

文章目录 一、命名规范1. 包名2. 变量名3. 函数名原因 二、代码格式1. 花括号位置2. 缩进3. 空格示例代码原因 三、错误处理1. 检查错误2. 错误值3. 多重错误处理示例代码原因 四、注释1. 注释内容2. 注释位置3. 避免冗余注释示例代码原因 五、总结 在Go语言编程中&#xff0c;…