Skip to main content

13. 列表类型:用法与内置函数

基础使用:使用列表切片操作和 append#

一个简单的例子如下,这些操作和我们使用 Golang 非常类似,当然切片的计算继承了 Python 的风格:

a = [1, 2]b = [4, 5, 6]
// 追加a = append(a, 3) // [1, 2, 3]
// 合并a = a + b // [1, 2, 3, 4, 5, 6]
// 访问元素,与字符串的索引完全相同println(a[0]) // 1println(a[:2]) // [1, 2]println(a[::-1]) // [6, 5, 4, 3, 2, 1]

内置方法#

同样,yaklang也支持slice的内置方法,可以实现一些很方便的操作,一个完整的例子如下:

a = [1, 2, 3]// Append / Push: 修改 a 变量的 list 值,追加一个值a.Append(4)assert a == [1, 2, 3, 4], sprint(a)
// Length / Len: 获取列表a的长度assert a.Length() == 4
// Capability / Cap: 获取列表a的容量assert a.Capability() == 4
// Extend 扩展 slice 长度,把新的数组追加到后面a.Extend([5, 6])assert a == [1, 2, 3, 4, 5, 6], sprint(a)
// Pop: 移除最后一个元素a = [1, 2, 3, 4]v = a.Pop()assert a == [1, 2, 3], sprint(a)assert v == 4, v
// 移除第n个元素,如果越界则移除最后一个v = a.Pop(1)assert a == [1, 3], sprint(a)assert v == 2, vv = a.Pop(99999)assert a == [1], sprint(a)assert v == 3, va = [1, 2, 3, 4, 5]v = a.Pop(-2)assert a == [1, 3, 4 ,5], sprint(a)assert v == 2, vv = a.Pop(-999999)assert a == [1, 3, 4], sprint(a)assert v == 5, v
// Insert:在第n个位置插入一个元素a.Insert(1, 2)assert a == [1, 2, 3, 4], sprint(a)a.Insert(999, 5)assert a == [1, 2, 3, 4, 5], sprint(a)a.Insert(-1, 999)assert a == [1, 2, 3, 4, 999, 5], sprint(a)a.Insert(-9999, 0)assert a == [0, 1, 2, 3, 4, 999, 5], sprint(a)
// Remove:移除一个元素(判断字面值相等)a = [1, 2, 1]a.Remove(1)assert a == [2, 1], sprint(a)a.Remove(1)assert a == [2], sprint(a)
// Shift:从数据开头移除一个元素,相当于Pop(0)a = [1, 2, 3, 4]assert a.Shift() == 1assert a == [2, 3, 4]
// Unshift: 从数据开头插入一个elem元素,相当于Insert(0, elem)a = [2, 3, 4]a.Unshift(1)assert a == [1, 2, 3, 4]
// Reverse:把数组内容倒序a = [1, 2, 3, 4]a.Reverse()assert a == [4, 3, 2, 1], sprint(a)a = [1, 2, 3, 4, 5]a.Reverse()assert a == [5, 4, 3, 2, 1], sprint(a)
// Sort:按字面值排序a = [4, 1, 3, 2]a.Sort()assert a == [1, 2, 3, 4], sprint(a)a = [4, 1, 3, 2]a.Sort(true)assert a == [4, 3, 2, 1], sprint(a)
// Map:会根据提供的函数对列表中的每一个函数做映射,返回映射后的列表a = [1, 2, 3, 4]a = a.Map(func (v) {    return v + 1})
// Map后的列表会转换为[]var,所以需要先将[2, 3, 4, 5]转换类型后再比较assert a == [2, 3, 4, 5].GeneralSlice() 
// Filter:会根据提供的函数对列表中的每一个函数做过滤,// 该函数返回true/false,将返回false的元素筛除,返回过滤后的列表a = [1, 2, 3, 4]a = a.Filter(func (v) {    return v > 2})assert a == [3, 4]
// Clear:移除所有元素a = [1, 2, 3]a.Clear()assert a == [], sprint(a)
// Count:计算元素存在的个数a = [1, 2, 3, 1]assert a.Count(1) == 2, a.Count(1)assert a.Count(5) == 0, a.Count(5)
// Index:返回列表中第n个元素,n支持负数表示倒数第n个元素a = [1, 2, 3, 4]assert a.Index(0) == 1, a.Index(0)assert a.Index(2) == 3, a.Index(3)assert a.Index(9999) == 4, a.Index(9999)assert a.Index(-1) == 4, a.Index(-1)assert a.Index(-9999) == 1, a.Index(-9999)
// StringSlice:将列表转换成[]string类型a = [nil, 1]assert a.StringSlice() == ["", "1"]
// GeneralSlice:将列表转换成[]var类型a = [1, 2]assert typeof(a.GeneralSlice()) == []var

附录:列表内置方法#

方法名描述
Append(elem...) / Push(elem...)在列表末尾追加新的elem元素
Pop(n...)弹出数组/切片的第n个元素,默认为最后一个
Insert(n, elem)在指定位置n插入elem元素
Extend(arr) / Merge(arr)用一个新的列表扩展原列表
Length() / Len()返回列表的长度
Capability() / Cap()返回列表的容量
StringSlice()将列表转换成[]string类型
GeneralSlice()将列表转换成[]var类型(即[]interface{})
Shift()从数据开头移除一个元素,相当于Pop(0)
Unshift(elem)从数据开头插入一个elem元素,相当于Insert(0, elem)
Map(func (elem)elem)会根据提供的函数对列表中的每一个函数做映射,返回映射后的列表
Filter(func (elem)bool)会根据提供的函数对列表中的每一个函数做过滤(该函数返回true/false,将返回false的元素筛除),返回过滤后的列表
Remove(elem)删除在列表中第一次出现的elem元素
Reverse()翻转列表
Sort(reverse...)排序列表,默认为升序,若设置reverse=true,则改为降序
Clear()清空列表
Count(elem)统计elem元素在列表中出现的次数
Index(n)返回列表中第n个元素,n支持负数表示倒数第n个元素