我使用namedtuple類很多。我一直在想,如果有一種很好的方法來爲這樣的類實現自定義排序,即使默認排序鍵不是第一個元素(然後是第二個,第三個等)的namedtuple。在namedtuple類上自定義排序
我的第一反應是實現__lt__
和__eq__
讓total_ordering
做休息(它填補了樂,NE,GT,GE):
from collections import namedtuple
from functools import total_ordering
@total_ordering
class B(namedtuple('B', 'x y')):
def __lt__(self, other):
return self.y < other.y
但是:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
哦,正確... total_ordering
只填寫了其他方法if they are missing。由於tuple/namedtuple有這樣的方法,total_ordering對我來說沒有任何幫助。
所以我想我的選擇是
- 停止使用namedtuple,只是建立自己的無聊的課,繼續使用total_ordering使用namedtuple
- 保管和使用namedtuple和插入實現所有6種比較方法
- 保持作爲第一個字段的排序值。幸運的是,我沒有太多類的實例,但通常我只是依靠字段的順序來初始化它們,這可能是討厭的。也許這是一個壞習慣。
有關解決此問題的最佳方法的建議?
爲什麼不只是按照您想排序的順序創建namedtuple字段? – BrenBarn
我沒有意識到我想排序/最大等,直到我已經創建並使用它一段時間。所以我現在可以添加一個領先的領域作爲排序領域,但它可能有點破壞性。 – pfctdayelise
但是你如何使用namedtuple?關於namedtuple的好處是它可以讓你按名稱訪問項目,所以你可以改變你的namedtuple,讓字段按照正確的順序,而不會影響你的代碼,只要你按名稱訪問字段(這可能是你在做什麼,或者爲什麼使用namedtuple?)。 – BrenBarn