【问题标题】:Python - Sorting a list of dictionariesPython - 对字典列表进行排序
【发布时间】:2017-10-27 19:02:06
【问题描述】:

我正在试验一种搜索算法,我正在尝试使用 A* 算法来解决问题。

我正在使用字典列表来维护内部节点结构。 每个节点都以某种状态和相关成本为特征。 选择函数应该返回成本最低的节点。 为了能够做到这一点,我每次都在过滤列表。 如果问题非常小,我发现这非常快, 但在列表很大的情况下,这个函数会占用算法总时间的 84%。

我的问题是是否有更有效的方法来做到这一点。

def select(self, frontier):
    frontier.sort(key = lambda x: x['f_cost'])
    #select the node with the lowest f_cost
    return frontier.pop(0)

【问题讨论】:

  • 您可能还想考虑使用优先级队列。例如,heapq.

标签: python sorting queue


【解决方案1】:

是的,不要从一开始就.pop!那是线性时间。 .pop 从头到尾都是不变的,所以就这样做吧:

def select(self, frontier):
    frontier.sort(key = lambda x: x['f_cost'], reverse=True)
    #select the node with the lowest f_cost
    return frontier.pop()

如果您尝试维护排序序列,您可能需要考虑其他数据结构。您可以查看heapq,它是标准库的一部分,尽管它非常简单。您还可以考虑sortedcontainers 库,它显然性能非常好。

【讨论】:

  • 那个“从头弹出”(O(n)) 大概没有排序(O(n log n))那么差,所以答案的第二部分(使用另一个数据结构) 看起来更有希望。
  • @Sebastian 是的,但请记住,timsort 最坏情况 O(n log n),但它几乎快排序-排序列表。话虽如此,你的观点仍然成立。
  • @juanpa.arrivillaga 与从前面弹出相比,它的速度并不快。与此相比,它非常缓慢。试试看。
【解决方案2】:

您应该使用 attrgetter 或 itemgetter 之类的函数作为您的密钥,而不是 lambda 函数,因为它被认为更快。

文档: https://docs.python.org/3/howto/sorting.html

有关详细信息,请查看此答案。 operator.itemgetter or lambda

【讨论】:

  • 那只会产生微小的差异。
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 2011-12-22
  • 2015-05-29
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多