在Python中对用户定义的类的对象进行排序
下面的文章讨论了如何根据类的任何变量来排列用户定义类的对象,这些变量显然将为每个对象保存一些值。到目前为止,我们知道如何对列表的元素进行排序,这里的概念或多或少相同,除了它向前迈出了一步,或者我们可以说它是排序元素的高级版本,而不是列表我们正在处理一个类的对象。
这里将使用 sorted() 方法。
句法:
sorted (iterable, key(optional), reverse(optional) )
示例:这只是一个通用示例,用于说明如何使用此方法
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))
输出:
[(‘geeks’, 1), (‘for’, 2), (‘computer’, 3), (‘science’, 3), (‘geeks’, 4)]
示例 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()))
输出:
[(‘computer’, 3), (‘for’, 2), (‘geeks’, 1), (‘geeks’, 4), (‘science’, 3)]
方法二:
此方法描述了如何使用 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))
输出:
inside class
[(‘geeks’, 1), (‘computer’, 3), (‘for’, 2), (‘geeks’, 4), (‘science’, 3)]
[(‘geeks’, 1), (‘for’, 2), (‘computer’, 3), (‘science’, 3), (‘geeks’, 4)]