我正在尝试使用(键,值)构建一个堆,因此键是一个数字,值是一个字典。
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)元素的正确方法是什么?
感谢。
答案 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)
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'})
------------------------------------