Как можно отсортировать список кортежей x, y в зигзагообразном порядке по Python? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть список точек, которые мне нужно отсортировать по зигзагообразному шаблону,

Я могу легко отсортировать по x +, y +

s = sorted(points, key=lambda tup: tup[1])
    print(sorted(s))

точек =

(73.76, 17.5495)
(72.635, 17.5495)
(72.635, 13.0495)
(73.76, 13.0495)
(73.76, -4.9505)
(73.76, -0.4505)
(72.635, -0.4505)
(72.6975, -4.9505)
(-72.635, -0.4505)
(-73.76, -0.4505)
(-73.76, -4.9505)
(-72.635, -4.9505)
(-72.635, 17.5495)
(-73.76, 17.5495)
(-73.76, 13.0495)
(-72.635, 13.0495)
(-75.75, -29.2532)
(-75.75, -32.2532)
(-69.75, -32.2532)
(-69.75, -29.2532)
(75.75, -32.2532)
(75.75, -29.2532)
(69.75, -29.2532)
(69.75, -32.2532)
(-54.25, -27.3195)
(-38.25, -27.3195)
(-38.25, -31.8195)
(-54.25, -31.8195)
(54.25, -31.8195)
(38.25, -31.8195)
(38.25, -27.3195)
(54.25, -27.3195)
(-79.5, 17.0)
(-77.0, 17.0)
(-77.0, 7.0)
(-79.5, 7.0)
(79.5, 17.0)
(77.0, 17.0)
(77.0, 7.0)
(79.5, 7.0)

результат:

[(-79.5, 7.0), (-79.5, 17.0), (-77.0, 7.0), (-77.0, 17.0), (-75.75, -32.2532), (-75.75, -29.2532), (-73.76, -4.9505), (-73.76, -0.4505), (-73.76, 13.0495), (-73.76, 17.5495), (-72.635, -4.9505), (-72.635, -0.4505), (-72.635, 13.0495), (-72.635, 17.5495), (-69.75, -32.2532), (-69.75, -29.2532), (-54.25, -31.8195), (-54.25, -27.3195), (-38.25, -31.8195), (-38.25, -27.3195), (38.25, -31.8195), (38.25, -27.3195), (54.25, -31.8195), (54.25, -27.3195), (69.75, -32.2532), (69.75, -29.2532), (72.635, -0.4505), (72.635, 13.0495), (72.635, 17.5495), (72.6975, -4.9505), (73.76, -4.9505), (73.76, -0.4505), (73.76, 13.0495), (73.76, 17.5495), (75.75, -32.2532), (75.75, -29.2532), (77.0, 7.0), (77.0, 17.0), (79.5, 7.0), (79.5, 17.0)]

, но это не эффективно для перемещения между точками. Как это можно отсортировать, чтобы второе значение сортировалось в обратном порядке для каждого другого уникального первого значения? что я могу сделать, но не то, что мне нужно -
Чего я хочу достичь

1 Ответ

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

Сначала я сохраняю уникальные «левые значения», используя set, затем перебираю их и сортирую каждый подсписок li, изменяя параметр reverse с помощью переменной rev. В final_list вы получаете сортировку "зигзаг"

points = [(1, 2), (1, 5), (3, 1), (3, 3), (2, 4), (2, 2)]

values = sorted(list(set(map(lambda x:x[0], points))))
# [1, 2, 3]

final_list = []
rev = False
for v in values:
    li = [x for x in points if x[0] == v]
    final_list += sorted(li, key=lambda tup: tup[1], reverse = rev)
    rev = not rev
print(final_list)
# [(1, 2), (1, 5), (2, 4), (2, 2), (3, 1), (3, 3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...