首页 > 解决方案 > Python通过具有条件的多个属性对列表进行复杂排序

问题描述

挑战来自此视频https://www.youtube.com/watch?v=GSBLe8cKu0s&feature=youtu.be

有一个建筑物列表。建筑物数据的格式为 [left, right, height],它被分为两个条目:[left, height, start] 和 [right, height, end],其中 start 和 end 是布尔类型。所以基本上,它是 [x, y, Boolean] 类型。(开始 = 真,结束 = 假)

现在我想根据 x 对这个 [x, y, Boolean] 列表进行排序,虽然 x 相同,但抢七将是布尔类型。如果 x 和 Boolean 类型相同,则下一个 tie break 是按 y 排序,这里是棘手的部分,根据 Boolean 标志对 y 的排序将是 ASC 或 DSC。

所以列表要按x坐标排序,然后start后end。对于 start(True) 相同的 x 坐标,y 坐标将按降序排序,而对于 end(False) 相同的 x 坐标,y 坐标将按升序排序。

标签: pythonsorting

解决方案


所以我们必须进行两次排序,最后我们将按 x(和布尔)坐标进行主排序。我们将首先使用布尔标志进行排序方向改变的排序。这里是:

data.sort(key=lambda k: -k[1] if k[2] else k[1])

然后将进行主要排序:

data.sort(key=lambda k: (k[0], -k[2]))

这是带有输入的完整代码。

def main():
    sol = Solution()  # None
    arg1 = [[1,3,4],[3,4,4],[2,6,2],[8,11,4],[7,9,3],[10,11,2]]
    r = sol.getSkyline(arg1)
    print(r)


class Solution:

    def getSkyline(self, buildings: List[List[int]]) -> List[List[int]]:
        if not buildings: return []
        data = []
        def compare(x, start):
            print(x, start)
            return (x, start)
        for building in buildings:
            data.append([building[0], building[2], True])
            data.append([building[1], building[2], False])
        data.sort(key=lambda k: -k[1] if k[2] else k[1])
        data.sort(key=lambda k: (k[0], -k[2]))
        return data

if __name__ == '__main__':
    main()

这是输出:

[1, 4, 真]

[2, 2, 真]

[3, 4, 真]

[3, 4, 错误]

[4, 4, 错误]

[6、2、错误]

[7, 3, 真]

[8, 4, 真]

[9, 3, 错误]

[10, 2, 真]

[11, 2, 错误]

[11, 4, 错误]


推荐阅读