#python
#питон
Вопрос:
У меня есть список списков, в каждом из которых есть несколько словарей. Первый список представляет все координаты, участвующие в триангуляции. Второй список представляет собой список словарей, связанных с этой координатой сетки. Каждый словарь в списке представляет все возможные координаты, которые находятся на определенном расстоянии Манхэттена от точки линии, которую мы пытаемся триангулировать, нашей цели. Любые координаты, существующие в каждом списке триангуляции, представляют точки перекрытия из этих позиций и, следовательно, потенциальное местоположение нашей цели.
В любом случае, я дал некоторую информацию, чтобы, надеюсь, добавить некоторое понимание. Я знаю, что это, вероятно, сбивает с толку, но я включу свою структуру данных, чтобы помочь визуализировать происходящее. Я пробовал перебирать их в цикле, но пока не нашел способа сделать это эффективно.
Кто-нибудь знает о какой-нибудь магии Python для создания списка координат, которые существуют в каждой группе координат?
Итак, в приведенном ниже примере мы начинаем с 3 разных групп координат. Мне нужно сгенерировать список любых пар x, y, которые существуют во всех 3 группах координат.
Пример:
[
[
{'x': 1, 'y': 0},
{'x': -1, 'y': 0},
{'x': 0, 'y': 1},
{'x': 0, 'y': -1}
],
[
{'x': 2, 'y': 0},
{'x': -2, 'y': 0},
{'x': 0, 'y': 2},
{'x': 0, 'y': -2},
{'x': 1, 'y': 1},
{'x': -1, 'y': -1},
{'x': -1, 'y': 1},
{'x': 1, 'y': -1}
],
[
{'x': 3, 'y': 0},
{'x': -3, 'y': 0},
{'x': 0, 'y': 3},
{'x': 0, 'y': -3},
{'x': 2, 'y': 1},
{'x': -2, 'y': -1},
{'x': -1, 'y': 2},
{'x': 1, 'y': -2},
{'x': 1, 'y': 2},
{'x': -1, 'y': -2},
{'x': -2, 'y': 1},
{'x': 2, 'y': -1}
]
]
Комментарии:
1. Для каждой группы поместите координаты в набор Python. Затем повторно вычислите пересечение. Координаты, которые вы ищете, находятся во всех трех наборах, так что в их пересечении.
2. Спасибо за комментарий, Жак. Мне следовало бы добавить, что я не очень продвинутый программист на Python. Не могли бы вы проиллюстрировать простой пример?
Ответ №1:
Волшебства нет. Вам просто нужно быть немного более осторожным со своими структурами данных. Вы помещаете координаты в dict, которые не являются хешируемыми. Таким образом, вы не можете добавить их в набор. Вам нужно использовать кортежи. Итак, ваша структура данных должна выглядеть следующим образом:
my_list = [
set([
(1, 0),
(-1, 0),
(0, 1),
(0, -1)
]),
set([
(1, 0),
(-2, 0),
(0, 2),
(0, -2),
(1, 1),
(-1, -1),
(-1, 1),
(1, -1)
]),
set([
(1, 0),
(-3, 0),
(0, 3),
(0, -3),
(2, 1),
(-2, -1),
(-1, 2),
(1, -2),
(1, 2),
(-1, -2),
(-2, 1),
(2, -1)
])
]
common = my_list[0]
for s2 in my_list[1:]:
common = common amp; s2
print common
Комментарии:
1. Сейчас я читаю о наборах. Этот фрагмент, похоже, не работает, даже когда я изменяю один из наборов, чтобы он содержал те же значения, что и другой набор.
2. Случайно отправил мой последний комментарий до того, как я закончил -_-. Я попытался создать повторяющийся набор в my_list, затем напечатать common в конце, но он остается пустым
3. Добавлено (1, 0) к каждому набору. Теперь код должен напечатать (1,0) . Не уверен, что вы подразумеваете под «пытались создать дубликат набора в my_list», но код выполняет то, что вы просите в исходном вопросе. Пожалуйста, поделитесь тестовым примером, в котором код завершается с ошибкой.
4. Это была ошибка с моей стороны. Я заставил это работать. Спасибо, Шаккар!