我有一个对象实例列表,我想将它们排序/唯一化到一个新列表中。每个对象都实现了多种属性,但重要的三个属性是a
、b
和c
。所有三个属性都返回一个整数值,从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)
对于这些特定对象,实例之间的唯一性取决于两个实例a
之间b
的值是否相同。如果它们不同,则c
从不考虑,否则,我们倾向于 的最大值c
。我想做的是从上面的示例中x
或x2
在我的示例中生成一个新列表,该列表仅包含一个实例,用于每种情况,当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()
自定义函数来做到这一点,但是这样做的算法/逻辑现在让我很难过。
想法?