px普贤教程PuXian
普贤教程 › 基础教程

列表

列表是 PuXian 唯一的顺序容器:可增长、可修改、可以放任意类型的值。

创建与读取

px
var xs = [3, 1, 2]
print(str(xs))
print(str(len(xs)))
print(str(xs[0]))
print(str(xs[2]))
print(str(xs[1:3]))
text
[3, 1, 2]
3
3
2
[1, 2]

列表里可以混放类型,但工程上建议同构——混放会让后面每个取值点都要先判断类型。

px
var mixed = [1, "二", true, null]
print(str(len(mixed)))
print(type(mixed[1]))
text
4
string

修改元素

px
var xs = [1, 2, 3]
xs[0] = 9
print(str(xs))
text
[9, 2, 3]

追加与弹出

px
var xs = [1, 2]
xs.append(3)
print(str(xs))
var last = xs.pop()
print(str(last))
print(str(xs))
text
[1, 2, 3]
3
[1, 2]
方法作用返回
append(v)末尾追加—
pop()弹出末尾元素被弹出的值
index(v)首次出现的位置下标
remove(v)删除某个值是否删除(真值)
len(xs)元素个数int
没有 insert列表没有 insert 方法,调用会得到「类型 list 没有方法 'insert'」。要在中间插入,用切片拼:
xs = xs[0:1] + [7] + xs[1:len(xs)]

查找与判断

px
var xs = [3, 1, 2]
print(str(xs.index(1)))
print(str(contains(xs, 2)))
print(str(contains(xs, 9)))
text
1
true
false

注意 index 返回的是位置(1 在第二个位置),不是值。

排序

px
var xs = [3, 1, 2]
var ys = sorted(xs)
print(str(xs))
print(str(ys))
print(str(sorted(["banana", "apple"])))
text
[3, 1, 2]
[1, 2, 3]
[apple, banana]

sorted 返回新列表,不修改原列表。要按自定义规则排序,用 sorted 对「键」排序再取值,例如按下标 1 的字段排序:

px
var rows = [["晨曦", 3], ["不空", 1], ["清歌", 2]]
var names = []
for r in rows:
    names.append(r[0])
print(str(sorted(names)))

# 手工按数值排序(选择排序)
var vals = [3, 1, 2]
var i = 0
while i < len(vals):
    var j = i + 1
    while j < len(vals):
        if vals[j] < vals[i]:
            var t = vals[i]
            vals[i] = vals[j]
            vals[j] = t
        j += 1
    i += 1
print(str(vals))
text
[不空, 晨曦, 清歌]
[1, 2, 3]

字符串按字符编码顺序排,中文不是按拼音。要按拼音排,用 registry 里的 pinyin 包先转成拼音再排。

遍历

px
var xs = ["a", "b", "c"]
for x in xs:
    print(x)

var i = 0
while i < len(xs):
    print(str(i) + ":" + xs[i])
    i += 1
text
a
b
c
0:a
1:b
2:c

嵌套列表

px
var grid = [[1, 2], [3, 4]]
print(str(grid[1][0]))
var total = 0
for row in grid:
    for cell in row:
        total += cell
print(str(total))
text
3
10

引用语义(最容易踩的坑)

px
var a = [1, 2]
var b = a
b.append(3)
print(str(a))
text
[1, 2, 3]

赋值不复制内容,两个名字指向同一份数据。要独立副本就显式复制:

px
var a = [1, 2]
var b = []
for x in a:
    b.append(x)
b.append(3)
print(str(a) + " / " + str(b))
text
[1, 2] / [1, 2, 3]

常见操作配方

px
# 求和
def total(xs):
    var s = 0
    for x in xs:
        s += x
    return s

# 过滤
def evens(xs):
    var out = []
    for x in xs:
        if x % 2 == 0:
            out.append(x)
    return out

# 映射
def doubled(xs):
    var out = []
    for x in xs:
        out.append(x * 2)
    return out

print(str(total([1, 2, 3, 4])))
print(str(evens([1, 2, 3, 4, 5, 6])))
print(str(doubled([1, 2, 3])))
text
10
[2, 4, 6]
[2, 4, 6]
没有列表推导式PuXian 不提供推导式语法,用上面这种「建空表 + 循环 append」的写法。可读性不差,而且每一步都能打断点看。