Поиск значений, существующих для каждого словаря в списке

#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. Это была ошибка с моей стороны. Я заставил это работать. Спасибо, Шаккар!