将字典插入堆Python

时间:2017-03-23 19:13:38

标签: python dictionary heap

我正在尝试使用(键,值)构建一个堆,因此键是一个数字,值是一个字典。

import heapq
heap = []
dic = {'val_1': 'number_1', 'val_2': 'number_2', 'val_3': 'number_3'}
insetToHeap = (2,dic)
heapq.heappush(heap, insetToHeap)

代码在heappush崩溃。该元素可能没有正确的格式。

编辑:

错误是:

  

TypeError:unorderable类型:dict()<字典()

插入(number,dic)元素的正确方法是什么?

感谢。

3 个答案:

答案 0 :(得分:4)

无法对字典进行排序,因此您需要创建一些可以保留字典但不会在比较中使用字典的字典。

元组不是一个好选择,因为它们中中的每个元素都可能进行比较。例如,如果第一个元素(您的key)相等,则比较第二个项目:

>>> (1, {'a': 1}) < (1, {'a': 2})
TypeError: unorderable types: dict() < dict()

heap

>>> heap = []
>>> heapq.heappush(heap, (2, {'a': 1}))
>>> heapq.heappush(heap, (2, {'b': 2}))
TypeError: unorderable types: dict() < dict()

如果key被警告不平等,则没有问题,因为第二项不会被比较。

如果您只想为dict添加一些存储空间,则只需创建一个存储(key, value)的类,但只能比较key

from functools import total_ordering

@total_ordering
class KeyDict(object):
    def __init__(self, key, dct):
        self.key = key
        self.dct = dct

    def __lt__(self, other):
        return self.key < other.key

    def __eq__(self, other):
        return self.key == other.key

    def __repr__(self):
        return '{0.__class__.__name__}(key={0.key}, dct={0.dct})'.format(self)

将这些内容插入您的heap,这样就可以确保dict不会被比较:

>>> import heapq
>>> heap = []
>>> heapq.heappush(heap, KeyDict(2, {'a': 1}))
>>> heapq.heappush(heap, KeyDict(2, {'b': 2}))
>>> heap
[KeyDict(key=2, dct={'a': 1}), KeyDict(key=2, dct={'b': 2})]

另一种方法是使用一个计数器作为第二个元素来使用3个元组,这些元素可以进行比较,而不会转到dict:

>>> from itertools import count
>>> cnt = count()
>>> heap = []
>>> heapq.heappush(heap, (2, next(cnt), {'a': 1}))
>>> heapq.heappush(heap, (2, next(cnt), {'b': 2}))
>>> heap
[(2, 0, {'a': 1}), (2, 1, {'b': 2})]

答案 1 :(得分:0)

在Python 3中无法比较

phpMySql个实例:

dict

这意味着如果第一个元素相等,你的元组也不能:

>>> {'a': 9} < {'a': 10}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'

您需要确保>>> (2, {'a': 9}) < (3, {'a': 10}) True >>> (2, {'a': 9}) < (2, {'a': 10}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '<' not supported between instances of 'dict' and 'dict' >>> 本身永远不需要进行比较。

答案 2 :(得分:0)

所以我做了一些测试,即使你没有显示完整的代码,你的代码似乎也会不止一个dict

>>> heapq.heappush(heap, (0,dic))
>>> heapq.heappush(heap, (0,dic2))
Traceback (most recent call last):
  File "python", line 1, in <module>
TypeError: unorderable types: dict() < dict()

你的堆正在比较字典,因为列表的第一项已被比较,因此它继续比较下一项,而你需要做类似的事情:

>>> heapq.heappush(heap, (0,dic))
>>> heapq.heappush(heap, (1,dic))
>>> show_tree(heap)

(0, {'val_1': 'number_1', 'val_2': 'number_2', 'val_3': 'number_3'})
(1, {'val_1': 'number_1', 'val_2': 'number_2', 'val_3': 'number_3'})
------------------------------------