Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于属性对对象进行排序_Python_Sorting - Fatal编程技术网

Python 基于属性对对象进行排序

Python 基于属性对对象进行排序,python,sorting,Python,Sorting,我正在尝试根据点对象的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,p

我正在尝试根据点对象的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]]

我想我正试图通过实现上述功能来交换每个实例的属性,但我不知道如何做到这一点。

通过将关键元素按您希望的顺序(第一个主值,第二个次值)放置在元组中,元组的排序方法将自动按照您希望实现的方式执行。 您只需更改
key
的值应设置为
key=get_XY
,其中
get_XY
返回x和y坐标的元组:

def get_XY(point):
    return point.x, point.y

元组将按照您想要的方式自然排序。您可以通过向类中添加
\uu lt\uu()
函数来简化操作<代码>排序将使用此功能进行比较。然后,您可以通过以下方式轻松地依赖元组的自然排序顺序:

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

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

您的顺序已关闭:您要先按Y排序,然后按X排序:
已排序(排序(point_list,key=get_Y,key=get_X)
很抱歉没有明确我的意图。但是我正试图从你的例子中得到类似的东西,对X进行排序,首先保持它的完整性,然后单独更改Y抱歉,这很不寻常-你实际上没有对点进行排序。排序之后,您将得到一组完全不同的点。在这种情况下,作为类方法这样做是没有意义的。事实上,除非在排序过程中创建新的点,否则使用point类是没有意义的。啊,我明白了,我会在排序时尝试创建一个新的点。非常感谢您演示
\uuuu lt\uuuuu
函数的用法。非常感谢您的解释和解决方案,作为一名非程序员,我可能需要一天的时间才能想出一个解决方案和一个混乱的解决方案。我尝试了这一点,然后它给出了一个错误
排序点=排序(点列表,键=(get_X,get_Y))TypeError:“tuple”对象不可调用
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]]