私はnamedtupleクラスをたくさん使っています。このようなクラスのカスタムソートを実装する良い方法がある場合、つまり、デフォルトのソートキーを名前付きタプルの最初の要素(2番目、3番目など)にしないと、私は今日考えています。 、名前付きタプルクラスのカスタムソート
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
ああ:しかし
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
:
私の最初の本能は__lt__
と__eq__
を実装し、total_ordering
が残り(それがルを記入、NE、GT、GE)をやらせることでした右... total_ordering
は、他の方法を記入してくださいif they are missing。 tuple/namedtupleにはこのようなメソッドがあるので、total_orderingは私のために何もしません。
だから私は私のオプションがnamedtupleを使用して
- 停止していると思いますし、ちょうどnamedtupleとインサートを使用してキープし、私自身の退屈なクラスを構築namedtupleを使用してtotal_ordering
- キープを使用しておくと、すべての6つの比較方法に
- を実装最初のフィールドとしてのソート値。幸いにも、私はクラスのインスタンスがあまり多くありませんが、通常、フィールドの順序を頼りにして初期化してしまうと厄介になります。たぶんそれは悪い習慣です。
これを解決するにはどうすればよいですか?
並べ替え順のフィールドを持つ名前付きタプルを作成しないのはなぜですか? – BrenBarn
私はすでにそれを作成してしばらく使っていない限り、私はそれをソート/マックスしたいとは思いませんでした。だから、先行フィールドをソートフィールドに追加することができましたが、少し混乱する可能性があります。 – pfctdayelise
しかし、名前付きタプルはどのように使用していますか?namedtupleの便利な点は、名前でアイテムにアクセスできるようにするため、フィールド名にアクセスする限り、名前付きタプルを変更して正しい順序でフィールドを持ち、コードに影響を与えないようにすることができます(おそらくそうでなければnamedtupleを使う理由は?)。 – BrenBarn