新しいリストに並べ替え/一意化したいオブジェクト インスタンスのリストがあります。各オブジェクトはさまざまなプロパティを実装していますが、重要な 3 つのプロパティはa
、b
、およびc
です。3 つのプロパティはすべて整数値を返し、低から高へ、高から低へとa
並べ替えられます。b
c
リストの例:
>>> x
>>> [<Foo object at 0x2b371b90>, <Foo object at 0x2b371f38>, <Foo object at 0x2b3719e0>, <Foo object at 0x2b376320>, <Foo object at 0x2b3765f0>]
a
、b
、およびの値c
を各オブジェクトのタプルにループして出力すると、次のようになります。
>>> for o in x:
... print (o.a, o.b, o.c)
...
(2, 78342112, 9)
(2, 78342117, 3)
(2, 78342112, 10)
(2, 78342112, 8)
(2, 78342117, 4)
オブジェクトのクラスで関数を定義することにより、リストをa
/b
低から高、高から低でソートする方法を見つけました。c
key()
def key(self):
return (self.a, self.b, -self.c)
そしてそれをに渡しsorted()
ます:
x2 = sorted(x, key=lambda x:x.key())
>>> for o in x2:
... print (o.a, o.b, o.c)
...
(2, 78342112, 10)
(2, 78342112, 9)
(2, 78342112, 8)
(2, 78342117, 4)
(2, 78342117, 3)
これらの特定のオブジェクトの場合、インスタンス間の一意性は、 と が 2 つのインスタンス間で同じ値であるかどうかによって異なりa
ますb
。それらが異なる場合、c
は考慮されません。それ以外の場合は、 の最大値を優先しますc
。私がやりたいのは、 または 上記の例のいずれx
かから新しいリストを生成し、とが同じx2
場合に各ケースに 1 つのインスタンスのみを含み、値が最大のものを保持することです。新しいリスト は次のようになります。a
b
c
x3
>>> x3 = <magic sorting/unique function called here>
>>> for o in x3:
... print (o.a, o.b, o.c)
...
(2, 78342112, 10)
(2, 78342117, 4)
カスタム関数を使用してこれを行うことができると思いますreduce()
が、そのためのアルゴリズム/ロジックは、現時点では単純に困惑しています。
アイデア?