📌  相关文章
📜  在Python中对用户定义的类的对象进行排序

📅  最后修改于: 2022-05-13 01:54:55.817000             🧑  作者: Mango

在Python中对用户定义的类的对象进行排序

下面的文章讨论了如何根据类的任何变量来排列用户定义类的对象,这些变量显然将为每个对象保存一些值。到目前为止,我们知道如何对列表的元素进行排序,这里的概念或多或少相同,除了它向前迈出了一步,或者我们可以说它是排序元素的高级版本,而不是列表我们正在处理一个类的对象。

这里将使用 sorted() 方法。

句法:

示例:这只是一个通用示例,用于说明如何使用此方法

Python3
print(sorted([1,26,3,9]))
  
print(sorted("Geeks foR gEEks".split(), key=str.lower))


Python3
class GFG:
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# sorting objects on the basis of value 
# stored at variable b
print(sorted(gfg, key=lambda x: x.b))


Python3
class GFG:
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# sorting objects on the basis of value 
# stored at variable a
print(sorted(gfg, key=lambda x: x.a.lower()))


Python3
import functools
from functools import total_ordering
  
  
@total_ordering
class GFG:
    print("inside class")
  
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __lt__(self, obj):
        return ((self.b) < (obj.b))
  
    def __gt__(self, obj):
        return ((self.b) > (obj.b))
  
    def __le__(self, obj):
        return ((self.b) <= (obj.b))
  
    def __ge__(self, obj):
        return ((self.b) >= (obj.b))
  
    def __eq__(self, obj):
        return (self.b == obj.b)
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# before sorting
print(gfg)
  
# sorting objects on the basis of value 
# stored at variable b
# after sorting
print(sorted(gfg))


输出:

[1, 3, 9, 26]
['foR', 'Geeks', 'gEEks']

对用户定义类的对象进行排序

方法一:

为了对用户定义的类的对象进行排序,需要为 sorted 方法设置一个键,这样该键将作为对象应该如何排序的指示符。参考下面给出的例子,这里为key提供了一个函数,该函数将每个对象的指定变量值逐一比较,并返回一个类的对象排序列表。

示例 1:按赋予它们的整数值的升序对元素进行排序

蟒蛇3

class GFG:
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# sorting objects on the basis of value 
# stored at variable b
print(sorted(gfg, key=lambda x: x.b))

输出:

示例 2:根据变量保存的字符串值对对象进行排序

蟒蛇3

class GFG:
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# sorting objects on the basis of value 
# stored at variable a
print(sorted(gfg, key=lambda x: x.a.lower()))

输出:

方法二:

此方法描述了如何使用 functools 内置方法 total_ordering 作为类的装饰器对用户定义的类的对象进行排序。在这里,类的定义与上面的例子一样,唯一的区别是在排序期间,使用了 total_ordering() 装饰器。使用 total_ordering() 的两个要求是-

  • 在小于(__lt__)、大于(__gt__)、小于等于(__le__) 和大于等于(__ge__) 中,至少应在使用此方法修饰的类中定义一个。
  • 应定义等于 (__eq__)。

在下面给出的小于和大于示例中,即使在处理过程中只调用一个(在这个小于)中,两者都被定义,因为一个足以决定元素的顺序,但定义所有元素是一种很好的编程习惯,以防万一一件事失败了。在排序过程中,会调用其中一种比较方法,根据某个元素比较对象,并返回排序结果。

例子:

蟒蛇3

import functools
from functools import total_ordering
  
  
@total_ordering
class GFG:
    print("inside class")
  
    def __init__(self, a, b):
        self.a = a
        self.b = b
  
    def __lt__(self, obj):
        return ((self.b) < (obj.b))
  
    def __gt__(self, obj):
        return ((self.b) > (obj.b))
  
    def __le__(self, obj):
        return ((self.b) <= (obj.b))
  
    def __ge__(self, obj):
        return ((self.b) >= (obj.b))
  
    def __eq__(self, obj):
        return (self.b == obj.b)
  
    def __repr__(self):
        return str((self.a, self.b))
  
  
# list of objects
gfg = [GFG("geeks", 1),
       GFG("computer", 3),
       GFG("for", 2),
       GFG("geeks", 4),
       GFG("science", 3)]
  
# before sorting
print(gfg)
  
# sorting objects on the basis of value 
# stored at variable b
# after sorting
print(sorted(gfg))

输出: