普贤教程 › 基础教程
列表
列表是 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」的写法。可读性不差,而且每一步都能打断点看。