【问题标题】:Fastest way to find the smallest number in a changing list in a loop in Python 3在 Python 3 的循环中找到变化列表中最小数字的最快方法
【发布时间】:2018-08-25 00:01:31
【问题描述】:

给定一个 2 元组列表 [(b,(x,y))],它在每次迭代循环时都会被操作(list.removelist.append)。在每次迭代中,都会请求并删除最小的数字。目前我使用min(list) 在每次迭代中找到具有最小b 的元组。

对于大型数据集,该算法的表现相当缓慢。在每次迭代中操作的列表中找到最小值的最佳方法是什么?

【问题讨论】:

  • 嗨,你有一小段代码来说明特定的用例吗?例如,如果您一次添加/删除一个元素,那么计算一次最小值然后检查最小值与您删除/添加的内容的比较会快得多。
  • 是的,我也想过这个问题,但在每次迭代中都会删除最小值。在排序列表中,我可以取第二小的元素,但我不知道排序是否有效
  • 一个选项是使用堆来管理值。 Python 有一个带有heapq 模块的标准实现。然后heappop(q) 总是会弹出最小值。而heappush(q, (b, (x, y))) 会将新值推入堆中。
  • 你必须保持列表的顺序吗?
  • 不,我只需要在每次迭代中选择并删除列表中的最小数字,然后将n 数字添加到列表中

标签: python-3.x list loops tuples min


【解决方案1】:

如果您总是删除列表中的最小元素,则应该使用排序列表而不是任意排序的列表。

这样,最小值将始终位于列表的开头。

除非您自己在特定点插入,否则标准 Python 列表不会排序。但是,您可以使用许多排序集合的实现,例如(纯 Python)Python sorted containers

【讨论】:

  • 注意:标准的heapq 模块会以已知的顺序维护一个标准的python 列表,适合优先级队列。
  • 据我所知,使用堆并不是最好的方法,因为我几乎每次迭代都需要搜索和删除列表中间的元素。或者懒惰的删除一个适当的解决方案?
  • @niaR,当您使用堆时,不再有“列表中间”处理。你说你每次迭代都删除最小的项目,现在将在一个已知的位置。
猜你喜欢
  • 2016-03-07
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 2010-10-08
  • 2017-02-28
  • 2020-09-04
相关资源
最近更新 更多