当前位置: 首页 > 面试题库 >

从列表/队列中删除一些项目的快速方法

那正初
2023-03-14
问题内容

这是一个类似问题的后续问题,该问题询问最佳书写方式

for item in somelist:
    if determine(item):
         code_to_remove_item

似乎共识是关于

somelist[:] = [x for x in somelist if not determine(x)]

但是,我认为如果只删除一些项目,则大多数项目都将被复制到同一对象中,这可能很慢。在回答另一个相关问题时,有人建议:

for item in reversed(somelist):
    if determine(item):
        somelist.remove(item)

但是,此处list.remove将搜索列表长度为O(N)的项目。可能我们的局限在于列表以数组而不是链接列表的形式表示,因此删除项目将需要在列表之后移动所有内容。但是,这里建议将collections.dequeue表示为双链表。然后应该可以在迭代时删除O(1)。我们实际上将如何实现?

更新 :我也使用以下代码进行了一些时间测试:

import timeit
setup = """
import random
random.seed(1)
b = [(random.random(),random.random()) for i in xrange(1000)]
c = []
def tokeep(x):
        return (x[1]>.45) and (x[1]<.5)
"""
listcomp = """
c[:] = [x for x in b if tokeep(x)]
"""
filt = """
c = filter(tokeep, b)
"""
print "list comp = ", timeit.timeit(listcomp,setup, number = 10000)
print "filtering = ", timeit.timeit(filt,setup, number = 10000)

并得到:

list comp =  4.01255393028
filtering =  3.59962391853

问题答案:

列表理解是渐近最优解:

somelist = [x for x in somelist if not determine(x)]

它只对列表进行一次传递,因此运行时间为O(n)。由于您需要在每个对象上调用define(),因此任何算法都至少需要O(n)个操作。列表理解确实需要进行一些复制,但是它只是复制对对象的引用,而不是复制对象本身。

从Python中的列表中删除项目为O(n),因此循环内带有remove,pop或del的所有内容均为O(n ** 2)。

另外,在CPython列表中,理解要比for循环快。



 类似资料:
  • 问题内容: 我正在尝试从具有相同的第一项和第三项但仅保留第一项的列表中删除列表。示例列表和输出: 由于原始列表包含数百万个列表,因此我编写的代码需要很长时间才能执行。 如何改善代码?提前致谢。 问题答案: 改进的版本: 更改为: 使用的,这使得查找更快。 转成元组,因为没有必要存储唯一的第一和第三元素列表。 减少的函数查找也可以加快代码的速度。

  • 问题内容: 在遍历列表时,我想根据条件删除列表中的项。请参见下面的代码。 这给了我一个例外。 如何才能做到这一点? 问题答案: 您需要使用和调用上,而不是使用循环。

  • 假设我们有一个函数,它返回100万个长度为30的整数向量,每个向量的条目都很小(比如-100到100之间)。进一步假设输出只有大约30000个唯一向量,其余是重复的。检索唯一输出向量列表的良好数据结构和算法是什么?优选地,当3%的唯一向量的比例大致恒定时,该解决方案应缩放良好。 这个问题主要是关于数据结构的,但我计划使用 STL 在 C 中实现它,所以也欢迎任何关于实现的提示。 朴素算法是存储已知

  • 我试图找出使用列名列表在df中删除列的最快方法。这是一种花哨的特征约简技术。这就是我现在正在使用的,而且是永远的。任何建议都非常感谢。

  • 问题内容: 我正在创建一个待办事项应用程序,当我们单击它们时,我无法编写用于删除列表元素的代码。我希望用户单击时删除特定项目 问题答案: 您需要传递待办事项的索引,然后使用javascript中的slice函数将其删除

  • 本文向大家介绍sharepoint 删除列表中的项目,包括了sharepoint 删除列表中的项目的使用技巧和注意事项,需要的朋友参考一下 示例