Python 如何从自定义对象按字段进行重分类

Python 如何从自定义对象按字段进行重分类,python,python-2.7,Python,Python 2.7,我正在从客户端接收服务器上的对象(每个对象都具有相同的结构,并且具有字段self.utc_time,其中包含该对象的创建时间)。我需要存储在一些结构中,所以我总是按升序排序,所以当我弹出时,我会按utc_时间弹出最旧的对象,而不是按接收时的时间。我想使用heapq中的优先级队列,但是如何说通过自定义对象的utc_时间字段进行heaify呢?有更好的解决方案吗?隐式地提供了以下解决方案: 堆元素可以是元组。这对于指定比较非常有用 主记录旁边的值(如任务优先级) 跟踪: 您可以以类似的方式进行存储—

我正在从客户端接收服务器上的对象(每个对象都具有相同的结构,并且具有字段self.utc_time,其中包含该对象的创建时间)。我需要存储在一些结构中,所以我总是按升序排序,所以当我弹出时,我会按utc_时间弹出最旧的对象,而不是按接收时的时间。我想使用heapq中的优先级队列,但是如何说通过自定义对象的utc_时间字段进行heaify呢?有更好的解决方案吗?

隐式地提供了以下解决方案:

堆元素可以是元组。这对于指定比较非常有用 主记录旁边的值(如任务优先级) 跟踪:

您可以以类似的方式进行存储—存储元组,其中第一个元素将包含放置到PQ的对象的
utc_time
,第二个元素是对对象本身的引用

在类似情况下,建议创建一个易于使用的包装器,以更干净的方式处理优先级队列。

将添加到类中,以避免需要进行Maksim描述的元组修饰:

>>> import heapq
>>> class MyObject(object):
...     def __init__(self, val):
...         self.val = val
...     def __cmp__(self, other):
...         return cmp(self.val, other.val)
...         
...     
... 
>>> q = []
>>> heapq.heappush(q, MyObject(50))
>>> heapq.heappush(q, MyObject(40))
>>> heapq.heappush(q, MyObject(30))
>>> heapq.heappush(q, MyObject(20))
>>> heapq.heappush(q, MyObject(200))
>>> obj = heapq.heappop(q)
>>> print obj.val
20

注意:在Python 3中重写
\uuuu cmp\uuuu
只有在Python 2中才能保证元组的第一个元素用作键?元组是如何比较的?
>>> import heapq
>>> class MyObject(object):
...     def __init__(self, val):
...         self.val = val
...     def __cmp__(self, other):
...         return cmp(self.val, other.val)
...         
...     
... 
>>> q = []
>>> heapq.heappush(q, MyObject(50))
>>> heapq.heappush(q, MyObject(40))
>>> heapq.heappush(q, MyObject(30))
>>> heapq.heappush(q, MyObject(20))
>>> heapq.heappush(q, MyObject(200))
>>> obj = heapq.heappop(q)
>>> print obj.val
20