oeasy Python 114 在列表指定位置插入insert

  • 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。

列表_有序列表_在指定位置插入_insert

回忆

|--------|------------|---------------|-------------------------------------------------|
| 类别 | 核心定义 | 关键特征 | 简单示例 |
| 方法 | 依附于类/对象 | 谁调用就改谁 | sl.reverse() sl.sort() |
| 函数 | 实现特定功能 | 调用时 把列表当参数传进去 | sorted(sl) |
| 参数 | 函数/方法 输入变量 | 根据参数 实现功能 | sorted(reverse = True) sl.sort(revserse = True) |

  • 排好序的列表
  • 就是 ​有序列表​
  • 再向 ​有序列表​ 新插 列表项
  • 就得 讲究 位置
  • 插入后
  • 有序列表
  • 还得 ​依然​有序
  • ​咋​插入 呢?🤔
新插列表项
复制代码
nl = list(range(0, 10, 3))
print(nl)
nl.append(5)
print(nl)
nl.sort()
print(nl)
  • 排好序 的 列表
  • 再追加 ​新​列表项
  • 还得 ​再​排序
  • 可以 在 ​合适的​位置
  • 直接插入 吗?
提问
手册
  • 好像list有个方法
  • 叫做insert
  • 查看手册

    help(list.insert)

  • 可以在指定索引之前插入

  • 先找索引
复原列表
复制代码
nl = [0,3,6,9]
  • 对 列表 重新赋值
  • 应该在​谁​之前插入?
找索引
  • 5 应该 插在6 之前
  • 6 的索引是多少呢?

    nl.index(6)

  • 6 的索引 是 2

  • 在 第2个 列表项 之前 插入
插入
  • 在 第2个 列表项 之前
  • 插入 5 这个数字

    print(nl)
    nl.insert(2, 5)
    print(nl)

  • 效果合适

  • 插入后的列表
  • 依然​有序​
insert
  • 这三个函数都是插入列表项

|--------|--------------|
| 方法 | 功能 |
| append | 末尾添加元素 |
| insert | 指定索引位置插元素 |
| extend | 将其元素 逐个添加到末尾 |

  • 有什么区别呢?
区别
  • 观察区别
  • 可以利用插入来排序吗?
sort
这就是插入排序
  • 把 列表中的 每个列表项
  • 都按顺序 插入 空列表
  • 就得到了 排好序的 新列表
  • list.sort 用的
  • 就是 ​插入排序​
观察源代码
  • 找到binary sort
  • 这是排序算法的核心
  • 二叉树 的 搜索
以2为底
  • 找到 插入位置的工作
  • 通过 二叉树搜索
  • binary search
  • 通过二叉树 找到位置
  • 然后把 新元素插入
  • 每次插入 只需要
  • log(n)次比较
  • 总共n个位置
  • 每个 都要找到合适的值
  • 所以
  • 外层循环次数 * 内层循环次数
  • n * log(n)
Big O Notation
  • 各种排序算法的对比
  • 这 Timsort 谁写的?
回到最初
  • 点击history
  • 回到1998年
  • Guido 还在荷兰 孤军奋战
  • Tim 通过电子邮件
  • 把代码 发给了 Guido
插入排序
  • tim 写下了插入排序的方法
命名
  • 这个函数 一度被
  • 叫做timsort

  • 可见 Guido 对于 Tim 认可和推举

    def timsort(the_array):
    runs, sorted_runs = [], []
    length = len(the_array)
    new_run = [the_array[0]]

    复制代码
      # for every i in the range of 1 to length of array
      for i in range(1, length):
          # if i is at the end of the list
          if i == length - 1:
              new_run.append(the_array[i])
              runs.append(new_run)
              break
          # if the i'th element of the array is less than the one before it
          if the_array[i] < the_array[i-1]:
              # if new_run is set to None (NULL)
              if not new_run:
                  runs.append([the_array[i]])
                  new_run.append(the_array[i])
              else:
                  runs.append(new_run)
                  new_run = []
          # else if its equal to or more than
          else:
              new_run.append(the_array[i])
    
      # for every item in runs, append it using insertion sort
      for item in runs:
          sorted_runs.append(insertion_sort(item))
      
      # for every run in sorted_runs, merge them
      sorted_array = []
      for run in sorted_runs:
          sorted_array = merge(sorted_array, run)
    
      print(sorted_array)

    timsort([2, 3, 1, 5, 6, 7])

插入与排序
  1. 排序的目的
  • 让 列表有序
  1. 有序的好处
  • 可以快速找到元素位置
  • 方便新元素 后续插入

3.插入新元素后 - 依然保持有序

  • 两者相互成就
  • 排序 支撑 插入
  • 插入 延续 排序
总结
  • 这次我们了解了
  • 定点插入 insert
  • 相对原来的 追加append
  • 排好序之后
  • 想要 保持有序
  • 需要 insert
  • ​定点​ 插入
  • 可以 ​定点​ 删除吗?
  • 下次再说 👋
  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。
相关推荐
十月的皮皮5 分钟前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
Echo缘1 小时前
嵌入式系统C语言资源分类与内存分布分析
c语言·开发语言
JaneConan1 小时前
鸿蒙 ArkUI 深水区:@Watch 和 @Observed,状态变了「自动跑」+ 嵌套对象「深层重绘」
开发语言·后端·ui·harmonyos
赤水无泪1 小时前
qt中图标、名称的设置方式
开发语言·qt
王莎莎-MinerU1 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
橘子海全栈攻城狮2 小时前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
在水一缸2 小时前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
AC赳赳老秦2 小时前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw
-银雾鸢尾-2 小时前
C#中Object类内的方法
开发语言·c#
huangdong_2 小时前
电商图片下载工具横向对比深度评测:固乔、FATKUN、图快、当图、淘蛙、存图宝七款工具全面解析
python