Python сложная сортировка списка по нескольким атрибутам с условием - PullRequest
0 голосов
/ 19 февраля 2020

Задача из этого видео https://www.youtube.com/watch?v=GSBLe8cKu0s&feature=youtu.be

Существует список зданий. Данные здания имеют формат [left, right, height] и массируются в две записи: [left, height, start] и [right, height, end], где start и end - логический тип. В общем, это тип [x, y, Boolean]. (start = True, end = False)

Теперь я хочу отсортировать этот список [x, y, Boolean] по x, и, хотя x то же самое, разрыв t ie будет иметь логический тип , Если и x, и логический тип совпадают, следующий разрыв t ie должен быть отсортирован по y, а здесь есть сложная часть, сортировка y будет AS C или DS C в соответствии с логическим флагом.

Таким образом, список должен быть отсортирован по координатам х, затем начинается с последующим концом. Для тех же координат x для начала (True) координаты y будут отсортированы по убыванию, а для тех же координат x для конца (False) координаты y будут отсортированы по возрастанию.

1 Ответ

0 голосов
/ 19 февраля 2020

Таким образом, мы должны выполнить сортировку два раза, и мы оставим первичную сортировку по координатам x (и логическим) в последнюю очередь. Мы сделаем сортировку, где направление сортировки сначала будет изменено с помощью логического флага. Вот оно:

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

, после чего следует первичная сортировка:

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

Вот полный код с input.

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

[2, 2, True]

[3 , 4, True]

[3, 4, False]

[4, 4, False]

[6, 2, False]

[7, 3, True]

[8, 4, True]

[9, 3, False]

[10, 2, True]

[11, 2, False]

[11, 4, False]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...