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

 当王子爱上灰姑娘 发布于 2023-01-29 19:26

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

有一些功能被Python提供:

    some_list.remove(value),但如果找不到值则抛出错误.

    some_list.pop(some_list[index]),删除列表中给定位置的项目,并将其返回.

    del (some_list[index]),它从给定索引中删除元素,它与pop不同,因为它不返回值.

场景:

如果要删除的项目很少,请说一个元素或1到5之间.

如果必须删除序列中的多个项目.

如果必须根据条件删除不同的项目.

如果你有一个列表列表并想要按顺序删除元素怎么样?

James Sapam.. 15

我的回答并不完全是你的问题,但在你读完之后,我希望你能决定你需要选择哪种类型来满足你的需求.

Python的列表是可变长度数组,而不是Lisp样式的链表.该实现使用对其他对象的连续引用数组,并保留指向此数组的指针.

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

附加或插入项目时,将调整引用数组的大小.应用了一些算法来提高重复附加项的性能; 当必须增长数组时,会分配一些额外的空间,因此接下来的几次不需要实际的大小调整,即过度分配.更多信息

删除vs Pop与删除:

乍一看,看起来所有人都在做同样的事情.

引擎盖下它的表现不同.

删除:通过从0索引迭代直到找到元素的第一个匹配来从列表中删除元素.如果元素结束,则需要更多时间进行迭代.

pop:使用索引从列表中删除元素.花更少的时间.

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

去掉:

它消除了第一次出现的价值.

如果值不存在,则引发ValueError.

它只需要一个参数,因此您不能一次删除多个值.

POP:

删除并返回索引处的项目(默认为last).

如果list为空或索引超出范围,则引发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:->

需要注意的是:

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

Realloc仍然取决于总长度.

但是,必须复制所有尾随元素

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

3 个回答
  • 我的回答并不完全是你的问题,但在你读完之后,我希望你能决定你需要选择哪种类型来满足你的需求.

    Python的列表是可变长度数组,而不是Lisp样式的链表.该实现使用对其他对象的连续引用数组,并保留指向此数组的指针.

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

    附加或插入项目时,将调整引用数组的大小.应用了一些算法来提高重复附加项的性能; 当必须增长数组时,会分配一些额外的空间,因此接下来的几次不需要实际的大小调整,即过度分配.更多信息

    删除vs Pop与删除:

    乍一看,看起来所有人都在做同样的事情.

    引擎盖下它的表现不同.

    删除:通过从0索引迭代直到找到元素的第一个匹配来从列表中删除元素.如果元素结束,则需要更多时间进行迭代.

    pop:使用索引从列表中删除元素.花更少的时间.

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

    去掉:

    它消除了第一次出现的价值.

    如果值不存在,则引发ValueError.

    它只需要一个参数,因此您不能一次删除多个值.

    POP:

    删除并返回索引处的项目(默认为last).

    如果list为空或索引超出范围,则引发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:->
    

    需要注意的是:

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

    Realloc仍然取决于总长度.

    但是,必须复制所有尾随元素

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

    2023-01-29 19:27 回答
  • 使用列表理解:

    方案1:

    [item for item in my_list if 1 <= item <=5 ]
    

    方案2:

    to_be_removed = {'a', '1', 2}
    [item for item in my_list if item not in to_be_removed ]
    

    方案3:

    [item for item in my_list if some_condition()]
    

    场景4(嵌套列表理解):

    [[item for item in seq if some_condition] for seq in my_list]
    

    请注意,如果要删除只是一个项目,然后list.removelist.pop并且del肯定会是非常快的,但是使用这些方法,同时遍历列表中可能会导致意外的输出。

    相关:循环“忘记”以删除一些项目

    2023-01-29 19:27 回答
  • 使用过滤器而不是列表理解:

    场景1:

    filter(lambda item: 1 <= item <= 5, my_list)
    

    场景2:

    to_be_removed = {'a', '1', 2}
    filter(lambda item: item not in to_be_removed, my_list)
    

    场景3:

    filter(lambda item: some_condition(), my_list)
    

    场景4(嵌套过滤列表):

    filter(lambda seq: filter(lambda item: some_condition(), seq), my_list) 
    

    出于某种原因,它与列表comprhension是一样的,但很明显我们正在过滤事物而不是生成它们.

    2023-01-29 19:27 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有