Python养成记

9、Python列表续

2022-03-23  本文已影响0人  魔方宫殿
Life is short, you need Python!

上集回顾:

  1. 用[]表示,元素用逗号分隔;
  2. 列表长度:len()
  3. 索引和范围,小心越界;
  4. 追加元素:append(item);
  5. 插入元素:insert(position, item);
  6. 删除末尾元素: pop();
  7. 删除指定位置的元素: pop(position);
  8. 列表排序: sort()。

列表list,又叫序列,别的编程语言叫数组,是编程中极其重要的一种数据类型。所以list数据类型需要重点学习,熟练掌握list的各种操作。列表是一种可变序列,它具有一般序列通用的操作,也有可变序列特有的操作。

一、通用序列操作
大多数序列类型,包括可变类型和不可变类型都支持下表中的操作。此表按优先级升序列出了序列操作。 在表格中,st 是具有相同类型的序列,n, i, jk 是整数而 x 是任何满足 s 所规定的类型和值限制的任意对象。
innot 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、innot 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、当 xs 中找不到时 index 会引发 ValueError。 不是所有实现都支持传入额外参数 ij。 这两个参数允许高效地搜索序列的子序列。 传入这两个额外参数大致相当于使用 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

备注:

  1. t 必须与它所替换的切片具有相同的长度。
  2. 可选参数 i 默认为 -1,因此在默认情况下会移除并返回最后一项。
  3. 当在 s 中找不到 xremove() 操作会引发 ValueError
  4. 当反转大尺寸序列时 reverse() 方法会原地修改该序列以保证空间经济性。 为提醒用户此操作是通过间接影响进行的,它并不会返回反转后的序列。
  5. 包括 clear()copy() 是为了与不支持切片操作的可变容器 (例如 dictset) 的接口保持一致。
  6. 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]

本集技能总结:

  1. 通用序列操作
  2. 可变序列操作

下集见

上一篇下一篇

猜你喜欢

热点阅读