gpt4 book ai didi

python - 根据属性对对象进行排序

转载 作者:行者123 更新时间:2023-11-30 22:33:29 26 4
gpt4 key购买 nike

我试图根据点对象的 X 和 Y 属性对点进行排序。下面的一个小例子解释了我的过程:

class Point:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z

def __repr__(self):
return '[{},{},{}]'.format(self.x, self.y, self.z)


#point instances
p1,p2,p3 = Point(7,85,5), Point(56,16,20), Point(24,3,30)

point_list = [p1,p2,p3]

def get_X(point):
return point.x

def get_Y(point):
return point.y

sorted_points = sorted(point_list, key = get_X)
# print(sorted_points) // [[7,85,5], [24,3,30], [56,16,20]]

sorted_points = sorted(sorted(point_list, key = get_X), key = get_Y)
# print(sorted_points) // [[24,3,30], [56,16,20], [7,85,5]]

但是我需要这样的输出,首先对 X 进行排序,然后对 Y 进行排序

[[7,3,5], [24,16,30], [56,85,20]]

我想我正在尝试通过实现上述目标来交换每个实例的属性,但我不知道该怎么做。

最佳答案

元组会自然地按照您想要的方式排序。您可以通过添加 __lt__() 来简化事情为你的类(class)发挥作用。 Sorted将使用此功能进行比较。然后,您可以轻松地依赖元组的自然排序顺序,如下所示:

class Point:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z

def __repr__(self):
return '[{},{},{}]'.format(self.x, self.y, self.z)

def __iter__(self):
return iter((self.x, self.y, self.z))

def __lt__(self, other):
return (self.x, self.y, self.z) < (other.x, other.y, other.z)



#point instances
point_list = [Point(7,85,5), Point(56,16,20), Point(24,3,30), Point(7, 20, 0), Point(56,16,15)]

sorted(point_list)
# --> [[7,20,0], [7,85,5], [24,3,30], [56,16,15], [56,16,20]]

编辑:创建新点

要通过单独组合每个点的排序元素来创建新点,您可以解压缩点,对它们进行排序,然后再次压缩它们。最好的方法是添加 __iter__()函数到您的类以使其可迭代,以便它可以支持 zip 。我已经在上面的代码中做到了这一点。这将允许您执行以下操作:

point_list = [Point(7,85,5), Point(56,16,20), Point(24,3,30), Point(7, 20, 0), Point(56,16,15)]
newTuples = list(zip(*[sorted(l) for l in zip(*point_list)]))
sortedPoints = [Point(*p) for p in newTuples ]

#sortedPoint => [[7,3,0], [7,16,5], [24,16,15], [56,20,20], [56,85,30]]

这也会对 z 值进行排序,但如果您出于某种原因需要它,很容易更改它。

关于python - 根据属性对对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45149283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com