Penlight项目中的表格与数组操作详解
概述
Penlight是一个强大的Lua扩展库,提供了许多实用的数据结构操作方法。本文将重点介绍Penlight中处理表格(Tables)和数组(Arrays)的核心功能,这些功能极大地简化了Lua开发者的日常工作。
Python风格列表(List)类
Penlight的List
类为Lua表格提供了类似Python列表的操作接口,使得处理数值索引表格更加方便。
基本操作示例
List = require 'pl.List'
l = List()
l:append(10) -- 添加元素
l:append(20)
print(l) -- 输出: {10,20}
l:extend {30,40} -- 扩展列表
print(l) -- 输出: {10,20,30,40}
l:insert(1,5) -- 在位置1插入5
print(l) -- 输出: {5,10,20,30,40}
print(l:pop()) -- 弹出最后一个元素并返回: 40
print(l) -- 输出: {5,10,20,30}
print(l:index(30)) -- 返回元素30的索引: 4
print(l:contains(30)) -- 检查是否包含30: true
l:reverse() -- 原地反转列表
print(l) -- 输出: {30,20,10,5}
切片操作
Penlight支持类似Python的切片操作,但使用1-based索引:
l = List {10,20,30,40}
print(l:slice(1,1)) -- 输出: {10}
print(l:slice(2,3)) -- 输出: {20,30}
print(l:slice(2,-2)) -- 输出: {20,30}
l:slice_assign(2,2,{21,22,23}) -- 替换切片
print(l) -- 输出: {10,21,22,23,30,40}
l:chop(1,1) -- 删除切片
print(l) -- 输出: {21,22,23,30,40}
高级特性
- 方法链式调用:大多数方法返回列表本身,支持链式调用
- 列表相等性:比较内容而非引用
- 字符串处理:可将字符串转换为字符列表
- 分区操作:根据条件将列表分为多个子列表
Map和Set类
Map类
Map
类提供了类似Python字典的接口:
Map = require 'pl.Map'
m = Map{one=1,two=2}
m:update {three=3,four=4,two=20} -- 更新键值
print(m:getvalues {'one','three'}) -- 获取多个值: {1,3}
Set类
Set
实现了集合操作:
Set = require 'pl.Set'
fruit = Set{'apple','banana','orange'}
colours = Set{'red','orange','green','blue'}
-- 集合运算
print(fruit + colours) -- 并集
print(fruit * colours) -- 交集
print(fruit - colours) -- 差集
print(fruit ^ colours) -- 对称差集
实用表格操作
表格复制与移动
-- 浅拷贝
t2 = tablex.copy(t1)
-- 深拷贝(包括嵌套表格和元表)
t2 = tablex.deepcopy(t1)
-- 列表部分拷贝
tablex.icopy(dest, src) -- 类似strcpy
tablex.move(dest, src) -- 类似memmove
表格比较
-- 深度比较
tablex.deepcompare(t1, t2)
-- 自定义比较函数
tablex.compare(t1, t2, function(a,b) return a.x == b.x end)
-- 无序比较
tablex.compare_no_order({1,2,3}, {3,2,1}) -- true
查找与索引
-- 线性查找
tablex.find(t, value)
-- 条件查找
tablex.find_if(t, function(x) return x > 10 end)
-- 创建索引映射
index_map = tablex.index_map(t)
排序迭代
-- 按键排序迭代
for k,v in tablex.sort(t) do print(k,v) end
-- 按值排序迭代
for k,v in tablex.sortv(t) do print(k,v) end
表格合并
-- 交集合并
tablex.merge(t1, t2, false)
-- 并集合并
tablex.merge(t1, t2, true)
映射操作
-- 应用函数到每个元素
squares = tablex.map(function(x) return x*x end, {1,2,3,4})
实际应用示例
员工数据对比
function read_employees(file)
local ls = List(io.lines(file))
return tablex.makeset(ls)
end
last = read_employees 'last-month.txt'
this = read_employees 'this-month.txt'
-- 找出新增员工
diff = tablex.difference(this, last)
for e in pairs(diff) do print(e) end
数值处理
-- 数值列表操作
n1 = NA{10,20,30}
n2 = NA{1,2,3}
ns = n1 + 2*n2 -- 向量运算
print(ns) -- 输出: {12,24,36}
-- 统计操作
min, max = ns:slice(1,2):minmax()
print(min, max) -- 输出: 12 24
总结
Penlight的表格和数组处理功能极大地扩展了Lua原生表格的能力,提供了:
- 类似Python的列表操作方法
- 强大的字典和集合实现
- 丰富的表格操作工具
- 函数式编程风格的映射操作
- 高效的数据处理能力
这些功能使Lua开发者能够更简洁、更高效地处理复杂数据结构,同时保持代码的可读性和可维护性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考