9、Python列表续

作者: 魔方宫殿 | 来源:发表于2022-03-23 22:58 被阅读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. 可变序列操作

    下集见

    相关文章

      网友评论

        本文标题:9、Python列表续

        本文链接:https://www.haomeiwen.com/subject/oeecjrtx.html