2

新しいリストに並べ替え/一意化したいオブジェクト インスタンスのリストがあります。各オブジェクトはさまざまなプロパティを実装していますが、重要な 3 つのプロパティはab、およびcです。3 つのプロパティはすべて整数値を返し、低から高へ、高から低へとa並べ替えられます。bc

リストの例:

>>> x
>>> [<Foo object at 0x2b371b90>, <Foo object at 0x2b371f38>, <Foo object at 0x2b3719e0>, <Foo object at 0x2b376320>, <Foo object at 0x2b3765f0>]


ab、およびの値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低から高、高から低でソートする方法を見つけました。ckey()

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 つのインスタンスのみを含み、値が最大のものを保持することです。新しいリスト は次のようになります。abcx3

>>> 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()が、そのためのアルゴリズム/ロジックは、現時点では単純に困惑しています。

アイデア?

4

1 に答える 1