我正在從客戶端接收服務器對象(每個對象具有相同的結構並且包含創建該對象的時間的字段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. 如何根據浮點字段對自定義ArrayList進行排序
- 2. Wordpress如何根據自定義字段對帖子進行排序
- 3. 根據特定字段對對象ArrayList進行排序
- 4. Flex自定義TreeItemRenderer,根據對象的類型進行更改?
- 5. LINQ到對象 - 如何根據字段進行分組
- 6. 如何根據文章中的自定義字段值進行排序/訂購
- 7. 如何根據自定義規則對excel項進行分組?
- 8. 如何按自定義字段對帖子進行分組
- 9. 通過包含在自定義對象中的字典對自定義對象數組進行排序:如何?
- 10. 如何根據對象進行映射?
- 11. 如何從對象到字典進行自定義轉換?
- 12. 如何按(字段,自定義函數,字段)對Django QuerySet進行排序
- 13. 如何用awk根據字段對行進行編號?
- 14. 如何根據多個字段對行進行分組?
- 15. SQL如何根據「訂單」字段對子行進行排序?
- 16. 如何根據mysql中的特定字段對組數據進行排序?
- 17. 添加自定義對象到自定義對象內的列表字段
- 18. 如何使用自定義對象對NSMutableArray進行排序?
- 19. 如何根據字段名稱對QTableWidget進行索引?
- 20. 如何根據日期字段對所有列進行排序
- 21. 如何根據字段對MySQL結果進行分組
- 22. Symfony2 - 如何根據自定義查詢獲取實體對象?
- 23. 如何訪問NSMutable數組中的自定義對象字段?
- 24. 如何根據自定義部分中的值對內容進行排序?
- 25. Redmine:對自定義字段進行分類的好處?
- 26. 根據python中的自定義比較器對字典項目進行排序
- 27. 如何根據父對象定義子對象?
- 28. 根據自定義字段數據顯示特定圖像
- 29. 對自定義字進行驗證
- 30. 如何根據自定義訂單對java列表進行排序