python - 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 坐标将按升序排序。
解决方案
所以我们必须进行两次排序,最后我们将按 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, 错误]
推荐阅读
- python - 设置命令不在 JSON 文件中写入信息
- reactjs - figma to reactjs:有可能还是手动做
- java - JasperReport - 在同一页面中连接多个报告会打印一个白页
- python - 如何将一长串参数传递给 FastAPI 中的 API 端点?
- nuxt.js - 我需要在加载页面之前重定向并显示 html 元素
- linux-kernel - Linux内核中的函数:trace_io_uring_submit_sqe在哪里?
- javascript - 求同一日期每一行的总和,插入到日期的末尾
- php - 如何使用 PHP 在字符串中排列数据
- android - android中的无障碍服务可以监控手机并截图吗?
- react-native - 反应原生动画值 this.props.onScroll 不是一个函数