Как создать сетку на основе списка координат?

Я пытаюсь решить задачу программирования, в которой у меня есть сетка каналов, представленная в виде списка позиций xy в текстовом файле. Мне нужно выяснить, какие из них правильно подключены от источника к месту назначения.

Вот пример текстового файла:

Как создать сетку на основе списка координат?

Вот соответствующая сетка, которую он представляет:

Как создать сетку на основе списка координат?

Я хочу создать сетку и перебрать ее. Я использовал pandas для чтения текстового файла, а затем превратил столбцы, представляющие значения x и y, в список.

pipes = pd.read_csv("D:\pipe.txt", delimiter = ' ', header = None)
char = pipes[0].tolist()
x_val = pipes[1].tolist()
y_val = pipes[2].tolist()

Я не знаю, существуют ли какие-либо библиотеки, которые могут помочь в работе с такими сетками.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по приведенному вами примеру, похоже, что у персонажа «трубы» есть отверстия сверху, снизу, слева и справа. Если мы войдем с одной стороны, мы сможем выйти из любых отверстий с любой другой стороны.

Учитывая это, мы можем создать класс Pipe для представления этой структуры:

class Pipe:
    def __init__(self, top, bottom, left, right):
        self.top = top
        self.bottom = bottom
        self.left = left
        self.right = right

В классе Pipe верх, низ, лево и право — это логические значения, которые показывают, есть ли там отверстие. Например, = будет Pipe(False, False, True, True).

Затем вы можете создать словарь, который сопоставит эти символы «канала» с объектами Pipe. Что-то вроде:

# I'm gonna assume you have a full list of "pipe" characters that will show up
pipe_mapping = {
    '=': Pipe(False, False, True, True),
    '‖': Pipe(True, True, False, False),
    '╬': Pipe(True, True, True, True),
    ...
}

Благодаря этому сопоставлению мы теперь можем преобразовать текстовый файл в 2D-список. Итак, пример, который вы привели, будет выглядеть так:

map = [
    ['*', Pipe(True, True, True, False), None, Pipe(False, True, False, True), Pipe(False, False, True, True), 'A'],
    [None, Pipe(True, True, False, True), Pipe(False, False, True, True), Pipe(True, False, True, False), None, None],
    ['C', None, Pipe(True, False, False, True), Pipe(False, False, True, True), 'B']
]

Это всего лишь псевдокод, объясняющий идею. Я оставлю вас разбираться, как представлять *, A, B, C и пустые места в этом контексте.

С помощью этой карты вы теперь можете реализовать свой алгоритм для решения этой задачи.

Надеюсь, поможет.

Хорошо, это имеет смысл. Как вы думаете, смогу ли я обобщить это на сотни трубок? Судя по тому, как это выглядит в вашем примере, вы создали список вручную.

Boltu 23.07.2024 02:02

Существует около 8 различных типов труб, охватывающих одну сетку.

Boltu 23.07.2024 02:10

@Boltu Итак, в словаре pipe_mapping всего 8 записей, которые вы можете создать вручную. 2D-список можно легко получить из txt-файла с помощью кода. Вы просто читаете файл построчно, для каждой строки перебираете каждый символ и используете pipe_mapping, чтобы сопоставить символ с соответствующим объектом. Я могу написать для вас демо, если что-то еще неясно.

AlpacaMax 23.07.2024 02:45

Позвольте мне добавить, как выглядит текстовый файл в моем исходном сообщении. Текстовый файл — это не сетка, а просто координаты труб в реальной сетке. Исходное изображение было просто представлением того, как выглядела сетка после ее построения.

Boltu 23.07.2024 04:16

@Болту, я вижу. В этом случае вам необходимо сначала рассчитать размер сетки. Ширина сетки — это наибольшее число во втором столбце. Высота сетки — это наибольшее число в третьем столбце. Затем вы сначала создаете 2D-список, заполненный None. Затем для каждой трубы вы находите соответствующую позицию в 2D-списке и помещаете туда соответствующий объект Pipe. Дайте мне знать, если это ясно.

AlpacaMax 23.07.2024 04:41

Другие вопросы по теме

Похожие вопросы

Как я могу помешать регистратору перегонного куба деактивировать мои собственные регистраторы после использования команды перегонного куба в коде?
Строка Python: извлеките дублированную и случайно объединенную подстроку
Как исправить этот Reg ex, чтобы он соответствовал словам, написанным через дефис, где последний сегмент заканчивается на согласную, отличную от буквы m?
Нужно ли мне использовать распознавание именованных объектов (NER) при токенизации?
Построение звездных карт в экваториальной системе координат
Случайная стратифицированная выборка у панд
Как я могу настроить оповещение или звуковой сигнал в случае поломки моего кода? (В идеале на Python)
Цикл for не добавляет массив с регулярным выражением
Использование callable_iterator (re.finditer) приводит к зависанию Python
Как получить метки ограничительной рамки и ее формат в Yolo 3D