有没有cmp sort参数的大对象排序方法吗?

时间:2018-08-18 04:29:56

标签: python

当我使用外部API时,它会以一个数组转储我,其中每个元素都是具有许多键的字典。随着Python3中cmp参数的弃用,我是否被迫编写看起来像这样的类?

@total_ordering
class SomeClass(object):
    def __init__(self, field1, field2, field3, field4, ..., field100):
        self.field1 = field1
        self.field2 = field2
        self.field3 = field3
        self.field4 = field4
        ...
        self.field100 = field100

    def __lt__(self, other):
        # some complex way to do ordering
        a = self.field3 * self.field4 - self.field5
        b = other.field3 * other.field4 - other.field5
        return a < b

在这里,我的问题是被迫将这个大字典变成一个类对象,如果我想要所有值,我将不得不编写这么长的构造函数。这在Python2中可以通过以下方式完成:

def compare(a, b):
    # some complex way to do ordering
    a = self.field3 * self.field4 - self.field5
    b = other.field3 * other.field4 - other.field5
    return a < b

sorted([dict1, dict2, ..., dict1000], cmp=compare)

1 个答案:

答案 0 :(得分:4)

Python的排序仅使用__lt__,因此,如果您只想对对象进行排序,则无需定义__eq____ne__

但是大多数人会使用可选的key=参数:

array_of_those_things.sort(key=lambda x: x.field2)

它也会以这种方式运行得更快-field2参数将导致O(N*log(N))检索{ {1}}与列表中的每个对象完全相同,并在整个排序过程中使用缓存的值。

您还将看到类似的内容:

key=

顺便说一句,我在这里提供的代码可能实际上无法工作,因为您没有显示如何访问原始对象的字段,而是仅显示了如何在填充对象后访问 进入一些人造课。因此,您必须调整sort()函数以适应原始对象的实际行为。

懒,但不推荐

在您使用的任何Python 2情况下

field2

可以在Python 3中执行此操作:

import operator
array_of_those_things.sort(key=operator.itemgetter("field2"))

但这在几乎所有情况下都是不必要的低效率。实际上,Python 2中的key=本身通常效率低下。尽可能使用Python 3的somelist.sort(cmp=f) 。但是,除非您提供有关原始数据的准确详细信息,否则我无法猜测它们是什么;-)