Поиск пар (x, y), у которых есть хотя бы одна точка x или y - PullRequest
2 голосов
/ 20 июня 2020

Допустим, у меня есть следующий список:

[[452, 268],
 [303, 181],
 [452, 331],
 [378, 217],
 [572, 476],
 [464, 218],
 [42, 440],
 [428, 476],
 [42, 36],
 [478, 35],
 [232, 275],
 [428, 440],
 [378, 36],
 [572, 35]]

Видно, что существуют пары, которые имеют одну и ту же точку x или y, например, первый элемент [452, 268] и третий [452, 331] использовать одну и ту же точку x.

Каким будет оптимальный способ создания массива с элементами формы [x1 y1 x2 y2], где две из одной из точек x1 y1 x2 y2 равны. Итак, по сути, я хотел бы l oop через все точки (x, y) и определить, разделяют ли они хотя бы один равный элемент, и объединить их в [x1 y1 x2 y2].

Моя идея заключалась в l oop просмотреть весь список и сравнить последовательные кортежи, но я не нашел подходящего способа подойти к этому. Я также попытался найти, есть ли у itertools помощники для этого, но безуспешно. Любая помощь приветствуется.

1 Ответ

3 голосов
/ 20 июня 2020

Надеюсь, я понял ваш вопрос. Это напечатает все комбинации точек, где они имеют одну общую координату (x или y):

points = [[452, 268],
 [303, 181],
 [452, 331],
 [378, 217],
 [572, 476],
 [464, 218],
 [42, 440],
 [428, 476],
 [42, 36],
 [478, 35],
 [232, 275],
 [428, 440],
 [378, 36],
 [572, 35]]


from pprint import pprint
from itertools import combinations, chain

x_points, y_points = {}, {}
for p in points:
    x_points.setdefault(p[0], []).append(p)
    y_points.setdefault(p[1], []).append(p)

out = []

for p in x_points.values():
    for c in combinations(p, 2):
        out.append(list(chain(*c)))

for p in y_points.values():
    for c in combinations(p, 2):
        out.append(list(chain(*c)))


pprint(out)

Печать:

[[452, 268, 452, 331],
 [378, 217, 378, 36],
 [572, 476, 572, 35],
 [42, 440, 42, 36],
 [428, 476, 428, 440],
 [572, 476, 428, 476],
 [42, 440, 428, 440],
 [42, 36, 378, 36],
 [478, 35, 572, 35]]

Для points = [[452, 268], [452, 331],[404, 268]]:

Результат:

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