如何从左上方到右下方订购坐标?

时间:2018-07-20 20:23:51

标签: python list sorting

我有一个类对象my_rectangle的列表:

class my_rectangle:
    def __init__(self,text,x_start,y_start,x_end,y_end):
        self.text=text
        self.x_start=x_start
        self.y_start=y_start
        self.x_end=x_end
        self.y_end=y_end
        self.x_centroid=(self.x_start+self.x_end)/2
        self.y_centroid=(self.y_start+self.y_end)/2

使用给出质心坐标的类属性(x_centroidy_centroid),我想使用从左到右然后从上到下的顺序对列表进行排序(正常的英语阅读顺序)?

说我有

A=my_rectangle('Hi,',1,3,2,4)
B=my_rectangle('Im',3,3,3,4)
C=my_rectangle('New',1,1,2,2)
my_list=[C,B,A]

我想命令它获得:

my_sorted_list=[A,B,C]

这是文本的表示形式

""" Hi, I'm
    New 
"""

2 个答案:

答案 0 :(得分:3)

生成排序列表是内置函数sorted()的特色。

使用多个值进行排序可以通过提供key函数来完成,该键函数将值作为元组返回。然后,根据元组的字典顺序对结果列表进行排序。

#UNTESTED
my_sorted_list = sorted(my_list, key=lambda item: (item.x_centroid, item.y_centroid))

答案 1 :(得分:1)

您可以通过定义Parse error: syntax error, unexpected '[', expecting ']'方法使自定义类可排序。这样可以照顾到$nodo_name=array( "34213897"=>"$n1_name", } $con->query("UPDATE test SET nodo='$nodo_name[$upchannel[$i]]' WHERE id='$i'"); 运算符,该运算符用于默认排序。

__lt__

我将<定义为属性,以便在初始化Rectangle后更改其他坐标时它将更新。

如果使用问题中的数据,则将获得此输出。

class Rectangle:
    def __init__(self,text,x_start,y_start,x_end,y_end):
        self.text=text
        self.x_start=x_start
        self.y_start=y_start
        self.x_end=x_end
        self.y_end=y_end

    @property
    def centroid(self):
        return (self.x_start+self.x_end)/2, (self.y_start+self.y_end)/2

    def __lt__(self, other):
        """Using "reading order" in a coordinate system where 0,0 is bottom left"""
        try:
            x0, y0 = self.centroid
            x1, y1 = other.centroid
            return (-y0, x0) < (-y1, x1)
        except AttributeError:
            return NotImplemented

    def __repr__(self):
        return 'Rectangle: ' + self.text