从列表中删除元素的最佳方法

2024-05-01

我想知道从列表中删除元素的最佳方法/有效方法是什么。

功能很少 https://docs.python.org/3/tutorial/datastructures.html#more-on-lists由Python提供:

  1. some_list.remove(value),但如果找不到值,则会抛出错误。
  2. some_list.pop(some_list[index]),删除列表中给定位置的项目并将其返回。
  3. del (some_list[index]),它从给定索引中删除元素,它与 pop 不同,因为它不返回值。

应用场景:

  • 如果您需要删除的项目很少,则可以删除一个元素或 1 到 5 个元素。
  • 如果您必须按顺序删除多个项目。
  • 如果您必须根据条件删除不同的项目。
  • 如果您有一个列表列表并且想要按顺序删除元素,该怎么办?

我的回答并不完全适合您的问题,但在您阅读本文后,我希望您能够决定您需要选择哪种类型来满足您的需求。

Python 的列表是变长数组 http://en.wikipedia.org/wiki/Variable-length_array,而不是 Lisp 风格的链表。该实现使用对其他对象的引用的连续数组,并保留指向该数组的指针。

这使得索引列表 a[i] 成为一种操作,其成本与列表的大小或索引的值无关。

当附加或插入项目时,引用数组的大小将被调整。 应用一些算法来提高重复追加项目的性能; 当数组必须增长时,会分配一些额外的空间,因此接下来的几次 不需要实际调整大小,即过度分配。更多信息 https://github.com/python-git/python/blob/master/Objects/listobject.c

删除、弹出、删除:

乍一看,他们似乎都在做同样的事情。

在引擎盖下它的行为有所不同。

removing https://github.com/python-git/python/blob/master/Objects/listobject.c#L2312:从列表中删除一个元素,从 0 索引迭代到第一个 找到该元素的匹配项。如果元素位于末尾,则需要更多时间进行迭代。

pop https://github.com/python-git/python/blob/master/Objects/listobject.c#L916:使用索引从列表中删除元素。花费更少的时间。

del: 是一个 python 语句,用于从名称空间或项目中删除名称 从字典中获取,或使用索引从列表中获取项目。

REMOVE:

  • 它删除了第一次出现的值。
  • 如果值不存在,则引发 ValueError。
  • 它只需要一个参数,因此您无法一次性删除多个值。

POP:

  • 删除并返回索引处的项目(默认为最后)。
  • 如果列表为空或索引超出范围,则引发 IndexError。
  • 它只需要一个参数,因此您无法一次性删除多个值。

DEL:

  • 删除索引处的项目并且不返回任何内容。
  • 它可以从列表中删除切片或可以清除整个列表。

基准:

最坏的情况:从列表末尾删除。

yopy:-> python -m timeit "x=range(1000)" "x.pop(999)"
100000 loops, best of 3: 10 usec per loop
yopy:-> python -m timeit "x=range(1000)" "x.remove(999)"
10000 loops, best of 3: 31.3 usec per loop
yopy:-> python -m timeit "x=range(1000)" "del x[999]"
100000 loops, best of 3: 9.86 usec per loop
yopy:->

最好的情况:列表的开头。

yopy:-> python -m timeit "x=range(1000)" "x.remove(1)"
100000 loops, best of 3: 10.3 usec per loop
yopy:-> python -m timeit "x=range(1000)" "x.pop(1)"
100000 loops, best of 3: 10.4 usec per loop
yopy:-> python -m timeit "x=range(1000)" "del x[1]"
100000 loops, best of 3: 10.4 usec per loop
yopy:->

需要注意的一点:

如果数组在中间增大或缩小

  • 重新分配仍然取决于总长度。
  • 但是,所有尾随元素都必须复制

所以,现在我希望你能决定你需要选择什么来满足你的需求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从列表中删除元素的最佳方法 的相关文章

随机推荐

  • SSRS 两个数据集需要在第二个数据集中使用一个数据集的字段作为参数?

    问题在于 包含数据的 in 字段只是从一组存储过程中提取的数据集中的一条记录 不可触摸 然后将其用作第二个数据集中的参数 任何帮助 将不胜感激 添加参数 选择参数可见性为隐藏 转到默认值 下面的屏幕截图 选择 从查询中获取值 然后选择您的第
  • 关闭彩盒

    我有一个简单的弹出窗口 不是 Iframe 用户可以在其中互相发送邮件 有一个用于发送信息的提交按钮和一个用于关闭叠加层的取消按钮 我确实在关闭按钮工作时遇到了一些麻烦 代码如下所示
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 在 python 中对自定义类执行集合操作

    我想将 Python 的内置 set 类与我创建的自定义类一起使用 如果我愿意 要创建包含自定义类实例的集合 我需要实现哪些函数才能执行测试 例如 set a set b 它可以开箱即用 但是 在某些情况下 过载是有意义的 eq https
  • Vue父组件访问子组件的compute属性

    在 Vue JS 中 当在数组元素 子元素 的计算属性中进行更改时 我无法监视数组的更改 我在编写的 JSFiddle 示例中总结了这个问题 因此该示例在逻辑上可能没有意义 但它确实显示了我的问题 https jsfiddle net tr
  • 数据库中的 GUID 类型

    GUID不是数据库中的正式数据类型 在我们现有的 SQL Server 设计中 Uniqueidentifier类型用于GUID价值 现在我们正在切换到Sybase数据库 我们应该使用varchar 36 来代替那个Uniqueidenti
  • ZonedDateTime 的 Jackson 反序列化问题

    我在反序列化我正在使用的服务期间使用的类中有以下字段 private ZonedDateTime transactionDateTime 我正在使用的服务可能会使用以下模式返回日期或日期时间 yyyy MM dd T HH mm ss SS
  • 打算在 Android 上打开 Instagram 用户个人资料

    我正在开发一款社交网络应用程序 我们的用户可以将他们的 Instagram 帐户连接到我们的服务 我想直接在他们的官方 Android 应用程序 如果已安装 中打开 Instagram 个人资料 但我找不到任何方法来做到这一点 然而 有一个
  • 在 TypeORM 单表继承中更新实体的类型

    有没有办法将继承实体的类型 在数据库中 更改为不同的实体类型 转换实体为uid from OldType to NewType await em update OldType uid uid entityTypeColumnName New
  • .NET 中的 vista/win7 放大 API

    Win7 Vista SDK中有magnification lib可供使用放大API http msdn microsoft com en us library ms692162 28VS 85 29 aspx对于C 如何在 NET win
  • 在 iOS 8 Today 扩展中获取 parse.com 用户数据时出现异常

    我正在尝试获取 PFUser 的 PFObjects 列表以在 iOS 8 Today Widget 中显示 按照此博客文章 http blog parse com announcements introducing local data
  • Java垂直布局?

    我需要将 JLabel 垂直放置在一些 JButton 上 就像游戏菜单一样 它们都应该居中 我已经下载了 MigLayout 但我不知道如何使用它 所以我只是想要一种方法来垂直和居中定位我的组件 无论 MigLayout 与否 另外 我不
  • 如何在嵌套数组中查找叶数组?

    我在 PHP 中有一个嵌套数组 array 0 gt 5x 1 gt array 0 gt 1 gt 2 gt 3 3 gt array 0 gt 1 gt 2 gt array I want to find this one 0 gt 1
  • OCaml 中类型和模块相等的规则是什么

    我无法理解 OCaml 中模块的平等性 函子应该是适用的 这就是互联网所声称的 但这有时似乎会失败 而且我不太明白其背后的一般规则 这是我的示例代码 module type PT sig end module P struct end le
  • 来自指针的 Typedef const 引用[重复]

    这个问题在这里已经有答案了 可能的重复 为什么允许将指针强制转换为引用 https stackoverflow com questions 5924248 why is it allowed to cast a pointer to a r
  • 了解 django admin readonly_fields

    我创建了一些代码来区分 Django admin 中的两个用户组 从而导致显示所有字段为只读或仅显示其中的一些字段 这些字段直接在 ModelAdmin 类中设置 首先这是代码 class PersonAdmin admin ModelAd
  • python中通过命令查找进程

    在我的 Python 脚本中 我想检查是否otherscript py目前正在 Linux 系统上运行 这psutil http psutil readthedocs io en latest 图书馆看起来是一个很好的解决方案 import
  • 可以匹配具有任意小数位数的非零浮点数的最短正则表达式是什么?

    可以匹配具有任意小数位数的非零浮点数的最短正则表达式是什么 它应该接受像这样的数字 1 5 9652 7 00002 0 8 0 0500 0 58000 0 01 0 000005 0 9900 5 7 5 7 005 但拒绝诸如 02
  • 破译Streamreduce函数

    为什么两者都是c1 and c2不被视为两个字符串 而是一个String和一个Integer Arrays asList duck chicken flamingo pelican stream reduce 0 c1 c2 gt c1 l
  • 从列表中删除元素的最佳方法

    我想知道从列表中删除元素的最佳方法 有效方法是什么 有功能很少 https docs python org 3 tutorial datastructures html more on lists由Python提供 some list re