我有一个要排序/唯一化到新列表中的对象实例列表。每个对象实现各种属性,但三个重要属性是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)
通过在对象的类中定义一个key()
函数,我知道了如何按a
/b
从低到高,c
从高到低对列表进行排序:
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()
和一个自定义函数来实现这一点,但实现这一点的算法/逻辑目前让我很困惑。你知道吗
想法?你知道吗
一种方法是使用^{} :
这将选择每个组中具有相同键的第一个元素。你知道吗
相关问题 更多 >
编程相关推荐