首页 / 知识
关于优化:在Python中从序列中移除项的优雅方法?
2023-04-12 15:44:00

Elegant way to remove items from sequence in Python?本问题已经有最佳答案,请猛点这里访问。
当我用python编写代码时,我经常需要根据某些条件从列表或其他序列类型中删除项。我还没有找到一个优雅高效的解决方案,因为从当前正在迭代的列表中删除项目是不好的。例如,您不能这样做:
我通常会这样做:
这是内在的,相当难看,而且可能有问题(它如何处理多个"john smith"条目?).是否有人有更优雅的解决方案,或者至少有更高效的解决方案? 用字典的怎么样? 实现过滤的两种简单方法是: 使用 使用列表理解: 注意,这两种情况都保留谓词函数计算为 编辑搞笑…两个人分别张贴了我在张贴我的答案时提出的两个答案。 您还可以在列表上向后迭代:
这样做的好处是,它不创建新的列表(如 请注意,尽管在向后迭代时删除元素是安全的,但是插入它们是比较棘手的。 显而易见的答案是约翰和其他几个人给出的答案,即:
但这样做的缺点是,它创建了一个新的列表对象,而不是重用原始对象。我做了一些分析和实验,我想到的最有效的方法是:
分配给"名称[:]"基本上意味着"用以下值替换名称列表的内容"。它不同于只分配给名称,因为它不会创建新的列表对象。赋值的右边是一个生成器表达式(注意使用括号而不是方括号)。这将导致python在列表中迭代。 一些快速分析表明,这比列表理解方法快30%,比过滤方法快40%。 注意:虽然这个解决方案比明显的解决方案更快,但它更模糊,并且依赖于更高级的Python技术。如果您确实使用它,我建议您在使用时附带一条评论。它可能只在您真正关心这个特定操作的性能的情况下才值得使用(无论什么情况下都非常快)。(在我使用它的情况下,我进行了一次*波束搜索,并使用它从搜索波束中删除搜索点。) 使用列表理解
有时筛选(使用筛选或列表理解)不起作用。当其他对象持有对您正在修改的列表的引用,并且需要在适当的位置修改该列表时,就会发生这种情况。
与原始代码的唯一区别是在for循环中使用了 这个过滤器太棒了。简单例子:
编辑:科里的列表理解能力也很棒。 如果应该就地过滤列表,并且列表大小相当大,那么前面的答案中提到的基于list.remove()的算法可能不合适,因为它们的计算复杂性是o(n^2)。在这种情况下,您可以使用以下no so python函数:
编辑:事实上,在https://stackoverflow.com/a/4639748/274937上的解决方案优于矿山解决方案。它更像Python,工作速度更快。因此,下面是一个新的filter inplace()实现:
要回答有关使用字典的问题,您应该注意,python3.0将包含dict理解:
同时,你可以这样做一个准听写理解:
或者作为一个更直接的答案:
解决方案、过滤和理解都需要构建一个新的列表。我不太清楚Python的内部结构,但我认为更传统(但不太优雅)的方法可能更有效:
总之,对于简短的列表,我坚持前面提出的两个解决方案中的任何一个。
这里是我的
如果是一套。
对于您的示例,过滤器和列表理解是可以的,但它们有几个问题:
您的原始解决方案实际上对非常大的列表更有效,即使我们同意它更丑。但是,如果您担心可以有多个"john smith",可以根据位置而不是根据值删除:
我们不能在不考虑列表大小的情况下选择解决方案,但是对于大列表,我更喜欢您的2通解决方案,而不是筛选或列表理解 很明显,这是您使用的数据结构的问题。例如,使用哈希表。有些实现支持每个键有多个条目,因此可以关闭最新的元素,或者删除所有的元素。 但这是,而且您将要找到的解决方案是,通过不同的数据结构实现优雅,而不是算法。也许你可以做得更好,如果它是排序的,或者什么的,但是列表上的迭代是你这里唯一的方法。 编辑:有人意识到他要求"效率"…所有这些建议的方法只是对列表进行迭代,这与他建议的方法相同。 |
最新内容
相关内容
python有map方法吗
python有map方法吗,培训,位置,数据,函数,列表,序列,参数,元素,方法,使用方法,python中的map:map()会根据提供的函数对指定序列做映射。第一个python怎么使用列表
python怎么使用列表,位置,培训,公式,列表,元素,表示,末尾,切片,倒数,顺序,python列表的简单操作1.在列表末尾添加元素:sth.append()2.在列表中python怎么获取列表元素的索引
python怎么获取列表元素的索引,培训,索引,元素,结果,列表,方法,中值,本文,下面,以上,本文主要介绍了python中如何获取列表的索引,以及如何返回python有哪些方法可以解压文件?
python有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大。python列表切片是什么
python列表切片是什么,位置,步长,合法,培训,数据,元素,切片,正数,负数,索引,我们基本上都知道Python的序列对象都是可以用索引号来引用的元素python函数与方法的区别是什么
python函数与方法的区别是什么,培训,函数,方法,区别,对象,以上,方式,更多,内容,python中函数和方法的区别1、函数要手动传self,方法不用传selpython列表是什么
python列表是什么,培训,位置,数字,名称,列表,元素,索引,括号,定义,复数,列表是元素的集合,存储在一个变量中。列表中存储的元素类型没有限制,下python类自带方法吗
python类自带方法吗,培训,方法,里面,实例,也就是说,下面,对象,以上,之后,参数,python中的类,创建好之后,里面是没有方法的,也就是说,类并没有自带python子类可以调用父类方法吗
python子类可以调用父类方法吗,培训,名称,资料,情况,地方,函数,参数,方法,表示,语句,python中的子类中的__init__()函数会覆盖父类的函数,一些python静态方法怎么使用self
python静态方法怎么使用self,培训,管理,不了,方法,静态,属性,实例,变量,对象,参数,python-静态方法,类方法,属性方法静态方法实际上与类(或者实python魔术方法是什么
python魔术方法是什么,培训,通信,设计,第一,第三,数据,方法,实例,对象,参数,1、什么是魔术方法魔法方法就是可以给你的类增加魔力的特殊方法,python怎么理解Python的构造方法
python怎么理解Python的构造方法,代码,名字,培训,方法,参数,对象,以上,结尾,函数,开头,在创建类时,我们可以手动添加一个__init__()方法,该方法