python - 从字典中创建优先级队列

标签 python algorithm sorting

我有一个字典,其中键是节点,值是另一个字典。该字典将节点的父节点以及到达该节点的成本作为键。例如:

nodes = {0: {'cost': 0, 'parent': None}, 1: {'cost': 2, 'parent': 0}, 2: {'cost': 3, 'parent': 0}, 3: {'cost': 6, 'parent': 1}, 4: {'cost': 8, 'parent': 2}}

我想按成本顺序提取每个节点。第一个值(value)较低。我怎样才能做到呢?

最佳答案

从字典中的每个条目构建一个二元组,其第一个成员是要用作排序键的值。在本例中,这是条目内部字典中的 cost 属性。

元组的第二个成员将是原始字典中条目的键。将此键放入元组中将允许您在元组通过优先级队列后引用原始字典中的条目。

将这些元组收集到一个列表中。

您可以在一条语句中完成上述所有操作:

tuplist = [ (v['cost'], k) for k, v in nodes.items() ]

然后使用heapq模块将元组列表组织为最小堆:

import heapq

heapq.heapify(tuplist)

现在你可以对最小堆做任何你想做的事情。大概您会想要使用 heapq.heappop() 来按成本升序提取元组,然后使用提取的元组中的键来访问相应的字典条目并对其执行某些操作。看起来像这样:

while tuplist:
    tup = heapq.heappop(tuplist)
    key = tup[1]
    print key, nodes[key]

产生:

0 {'cost': 0, 'parent': None}
1 {'cost': 2, 'parent': 0}
2 {'cost': 3, 'parent': 0}
3 {'cost': 6, 'parent': 1}
4 {'cost': 8, 'parent': 2}

关于python - 从字典中创建优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59010472/

相关文章:

java - 需要对特定字段的 ArrayList<Object> 进行排序?

python - pandas Series.value_counts 返回相等计数字符串的不一致顺序

java - 如何找到乘积大于总和的对

python - 使用一些偏移量从服务器读取文件

python - 如何像这样在 "|"中每隔5插入 "-"?

python - 使用 autorun 运行 python 应用程序时出现编码问题

java - 遍历Java中的所有颜色

java - Java中Levenshtein算法的问题

c++ - 如何根据其值的某些转换的值对范围进行排序?

python - 如何有效地选择按索引 pandas 分组的列中的最小值?