我想知道从列表中删除元素的最佳方式/有效方式是什么。
有few functions由 Python 提供:
some_list.remove(value)
,但如果找不到值,它会抛出错误。some_list.pop(some_list[index])
,移除列表中给定位置的项目,并返回它。del (some_list[index])
,它从给定索引中删除元素,它与 pop 不同,因为它不返回值。
场景:
- 如果您要删除的项目很少,请说一个元素或 1 到 5 个元素。
- 如果您必须删除序列中的多个项目。
- 如果您必须根据条件删除不同的项目。
- 如果您有一个列表的列表并希望按顺序删除元素怎么办。
最佳答案
我的回答并不完全针对你的问题,但在你阅读本文后,我希望你能根据自己的需要决定选择哪种类型。
Python 的列表是 variable-length arrays ,而不是 Lisp 风格的链表。该实现使用对其他对象的连续引用数组,并保留指向该数组的指针。
这使得索引列表成为一个[i]操作,其成本独立于列表的大小或索引的值。
当追加或插入项目时,引用数组的大小会调整。 应用了一些算法来提高重复附加项的性能; 当数组必须增长时,会分配一些额外的空间,所以接下来的几次 不需要实际调整大小,即过度分配。 More Information
删除与弹出与删除:
乍一看,它们似乎都在做同样的事情。
在引擎盖下它的行为不同。
removing :通过从 0 索引迭代到第一个从列表中删除一个元素 找到元素的匹配项。如果元素位于末尾,则需要更多时间进行迭代。
pop :使用索引从列表中删除元素。花费更少的时间。
del :是一个 python 语句,用于从命名空间或项目中删除名称 从字典中,或通过使用索引从列表中的项目。
删除:
- 它删除了第一次出现的值。
- 如果值不存在则引发 ValueError。
- 它只接受一个参数,因此您不能一次性删除多个值。
流行音乐:
- 删除并返回索引处的项目(默认最后一个)。
- 如果列表为空或索引超出范围,则引发 IndexError。
- 它只接受一个参数,因此您不能一次性删除多个值。
删除:
- 删除索引处的项目并且不返回任何内容。
- 它可以从列表中删除切片或清除整个列表。
基准:
最坏情况:从列表末尾删除。
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:->
注意事项:
如果数组在中间增长或收缩
- Realoc 仍然取决于总长度。
- 但是,必须复制所有尾随元素
所以,现在我希望您可以根据自己的需要来决定需要选择什么。
关于python - 从列表中删除元素的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21510140/