从较大的列表中排序/唯一的对象实例列表?

2024-04-19 15:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个要排序/唯一化到新列表中的对象实例列表。每个对象实现各种属性,但三个重要属性是abc。这三个属性都返回一个整数值,ab从低到高排序,c从高到低排序。你知道吗

示例列表:

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


如果我在每个对象的元组中循环并打印abc的值,它们将如下所示:

>>> 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)


对于这些特定对象,实例之间的唯一性取决于ab是否是两个实例之间的相同值。如果它们不同,则从不考虑c,否则,我们赞成c的最大值。我想做的是从xx2生成一个新列表,当ab相同时,每个实例只包含一个实例,并保留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()和一个自定义函数来实现这一点,但实现这一点的算法/逻辑目前让我很困惑。你知道吗

想法?你知道吗


Tags: 对象实例keyinself列表for属性
1条回答
网友
1楼 · 发布于 2024-04-19 15:51:15

一种方法是使用^{}

import itertools

x3 = [next(g) for k, g in itertools.groupby(x2, lambda x:(x.a, x.b))]

这将选择每个组中具有相同键的第一个元素。你知道吗

相关问题 更多 >