上集回顾:
- 用[]表示,元素用逗号分隔;
- 列表长度:len()
- 索引和范围,小心越界;
- 追加元素:append(item);
- 插入元素:insert(position, item);
- 删除末尾元素: pop();
- 删除指定位置的元素: pop(position);
- 列表排序: sort()。
列表list,又叫序列,别的编程语言叫数组,是编程中极其重要的一种数据类型。所以list数据类型需要重点学习,熟练掌握list的各种操作。列表是一种可变序列,它具有一般序列通用的操作,也有可变序列特有的操作。
一、通用序列操作
大多数序列类型,包括可变类型和不可变类型都支持下表中的操作。此表按优先级升序列出了序列操作。 在表格中,s 和 t 是具有相同类型的序列,n, i, j 和 k 是整数而 x 是任何满足 s 所规定的类型和值限制的任意对象。
in
和 not in
操作具有与比较操作相同的优先级。 +
(拼接) 和 *
(重复) 操作具有与对应数值运算相同的优先级。
操作 | 结果 | 备注 |
---|---|---|
x in s | 如果 s 中的某项等于 x 则结果为 True,否则为 False | 1 |
x not in s | 如果 s 中的某项等于 x 则结果为 False,否则为 True | 1 |
s + t | s 与 t 相拼接 | 2 |
s * n 或 n * s | 相当于 s 与自身进行 n 次拼接 | 2 |
s[i] | s 的第 i 项,起始为 0 | 3 |
s[i:j] | s 从 i 到 j 的切片 | 3、4 |
s[i:j:k] | s 从 i 到 j 步长为 k 的切片 | 3、5 |
len(s) | s 的长度 | 无 |
min(s) | s 的最小项 | 无 |
max(s) | s 的最大项 | 无 |
s.index(x[, i[, j]]) | x 在 s 中首次出现项的索引号(索引号在 i 或其后且在 j 之前) | 6 |
s.count(x) | x 在 s 中出现的总次数 |
备注:
1、in
和 not in
:
>>> 3 in [1, 2, 3]
True
>>> 3 not in [1, 2, 3]
False
2、s + t、s * n 或 n * s
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> 3 * [1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
3、果 i 或 j 为负值,则索引顺序是相对于序列 s 的末尾: 索引号会被替换为 len(s) + i 或 len(s) + j。 但要注意 -0 仍然为 0。
4、s 从 i 到 j 的切片被定义为所有满足 i <= k < j 的索引号 k 的项组成的序列。 如果 i 或 j 大于 len(s),则使用 len(s)。 如果 i 被省略或为 None,则使用 0。 如果 j 被省略或为 None,则使用 len(s)。 如果 i 大于等于 j,则切片为空。
5、s 从 i 到 j 步长为 k 的切片被定义为所有满足 0 <= n < (j-i)/k 的索引号 x = i + nk 的项组成的序列。 换句话说,索引号为 i, i+k, i+2k, i+3*k,以此类推,当达到 j 时停止 (但一定不包括 j)。 当 k 为正值时,i 和 j 会被减至不大于 len(s)。 当 k 为负值时,i 和 j 会被减至不大于 len(s) - 1。 如果 i 或 j 被省略或为 None,它们会成为“终止”值 (是哪一端的终止值则取决于 k 的符号)。 请注意,k 不可为零。 如果 k 为 None,则当作 1 处理。
6、当 x 在 s 中找不到时 index
会引发 ValueError
。 不是所有实现都支持传入额外参数 i 和 j。 这两个参数允许高效地搜索序列的子序列。 传入这两个额外参数大致相当于使用 s[i:j].index(x)
,但是不会复制任何数据,并且返回的索引是相对于序列的开头而非切片的开头。
二、可变序列操作
以下表格中的操作是在可变序列类型上定义的。表格中的 s 是可变序列类型的实例,t 是任意可迭代对象,而 x 是符合对 s 所规定类型与值限制的任何对象 (例如,bytearray
仅接受满足 0 <= x <= 255
值限制的整数)。
操作 | 结果 | 备注 |
---|---|---|
s[i] = x | 将 s 的第 i 项替换为 x | 无 |
s[i:j] = t | 将 s 从 i 到 j 的切片替换为可迭代对象 t 的内容 | 无 |
del s[i:j] | 等同于 s[i:j] = [] | 无 |
s[i:j:k] = t | 将 s[i:j:k] 的元素替换为 t 的元素 | 1 |
del s[i:j:k] | 从列表中移除 s[i:j:k] 的元素 | 无 |
s.append(x) | 将 x 添加到序列的末尾 (等同于 s[len(s):len(s)] = [x]) | 无 |
s.clear() | 从 s 中移除所有项 (等同于 del s[:]) | 5 |
s.copy() | 创建 s 的浅拷贝 (等同于 s[:]) | 5 |
s.extend(t) 或 s += t | 用 t 的内容扩展 s (基本上等同于 s[len(s):len(s)] = t) | 无 |
s *= n | 使用 s 的内容重复 n 次来对其进行更新 | 6 |
s.insert(i, x) | 在由 i 给出的索引位置将 x 插入 s (等同于 s[i:i] = [x]) | 无 |
s.pop() 或 s.pop(i) | 提取在 i 位置上的项,并将其从 s 中移除 | 2 |
s.remove(x) | 删除 s 中第一个 s[i] 等于 x 的项目 | 3 |
s.reverse() | 就地将列表中的元素逆序 | 4 |
备注:
- t 必须与它所替换的切片具有相同的长度。
- 可选参数 i 默认为
-1
,因此在默认情况下会移除并返回最后一项。 - 当在 s 中找不到 x 时
remove()
操作会引发ValueError
。 - 当反转大尺寸序列时
reverse()
方法会原地修改该序列以保证空间经济性。 为提醒用户此操作是通过间接影响进行的,它并不会返回反转后的序列。 - 包括
clear()
和copy()
是为了与不支持切片操作的可变容器 (例如dict
和set
) 的接口保持一致。 -
n 值为一个整数,或是一个实现了
__index__()
的对象。 n 值为零或负数将清空序列。 序列中的项不会被拷贝;它们会被多次引用,正如通用序列操作
中有关s * n
的说明。
切片示例:
>>> l = 3 * [1, 2, 3]
>>> l
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> l[0:8]
[1, 2, 3, 1, 2, 3, 1, 2]
>>> l[0:8:3]
[1, 1, 1]
>>> l[0:8:3] = [6, 6, 6]
>>> l
[6, 2, 3, 6, 2, 3, 6, 2, 3]
本集技能总结:
- 通用序列操作
- 可变序列操作
下集见
网友评论