我正在从客户端接收服务器对象(每个对象具有相同的结构并且包含创建该对象的时间的字段self.utc_time)。我需要在一些结构中存储,所以我总是按升序排序,所以当我弹出时,我用utc_time弹出最老的对象,而不是按我收到的时间。我想使用heapq中的优先级队列,但是如何说通过自定义对象的utc_time字段进行heaify?有更好的解决方案吗?如何根据自定义对象的字段进行heapify
3
A
回答
13
添加magic __cmp__
comparison method到您的类,以避免需要做的元组装饰是马克西姆描述:
>>> 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
注:覆盖__lt__
的Python 3,__cmp__
只有在Python 2
6
Python documentation隐式地提供以下解决方案:
堆元件可以是元组。这是旁边的主记录分配比较 值(如任务优先级)有用正在 追踪:
h = []
heappush(h, (5, 'write code'))
heappush(h, (7, 'release product'))
heappush(h, (1, 'write spec'))
heappush(h, (3, 'create tests'))
heappop(h)
=> (1, 'write spec')
你可以做一个类似的方式 - 专卖店的元组的第一个元素将包含utc_time
一个对象被放置到PQ中,第二个 - 对象本身的引用。
在类似的SO question中,建议创建一个易于使用的包装器,该包装器允许使用优先级队列的更简洁的方式。
相关问题
- 1. Wordpress如何根据自定义字段对帖子进行排序
- 2. 如何根据浮点字段对自定义ArrayList进行排序
- 3. Flex自定义TreeItemRenderer,根据对象的类型进行更改?
- 4. LINQ到对象 - 如何根据字段进行分组
- 5. SQL如何根据“订单”字段对子行进行排序?
- 6. 如何用awk根据字段对行进行编号?
- 7. 如何根据mysql中的特定字段对组数据进行排序?
- 8. 如何根据字段对MySQL结果进行分组
- 9. 如何根据日期字段对所有列进行排序
- 10. Symfony2 - 如何根据自定义查询获取实体对象?
- 11. 如何访问NSMutable数组中的自定义对象字段?
- 12. Redmine:对自定义字段进行分类的好处?
- 13. 如何根据父对象定义子对象?
- 14. 根据自定义字段数据显示特定图像
- 15. 如何使用自定义对象创建自定义对象?
- 16. 根据定义的依赖性对对象进行排序的干净算法?
- 17. 使用JQuery对文本字段进行自定义验证
- 18. 如何根据对象的属性对数组进行排序?
- 19. 如何根据对象的属性对列表进行排序
- 20. 首先根据自定义规则对列表进行分组,然后根据其他字段对分组进行排序
- 21. 在MySQL中,如何根据两个字段的值来对行进行分组?
- 22. 自定义字典对象?
- 23. 先进的自定义字段WordPress的自定义类
- 24. Ruby:如何根据类名获取类,以及如何根据字段名获取对象的字段?
- 25. 根据自定义字段数据添加图像
- 26. 如何使用js根据键对JSON对象进行排序?
- 27. 根据字段对Json数据进行排序
- 28. 根据复选框字段在gridview中对行进行操作
- 29. 如何根据对象的值对对象数组进行排序?
- 30. 如何根据对象的变量之一对对象列表进行排序