Сравните ключи и значения в одном словаре - PullRequest
2 голосов
/ 17 июня 2019
{(0, 0): {(0, 1), (1, 0)},
 (0, 3): {(0, 2), (0, 4), (1, 3)},
 (0, 4): {(0, 3), (1, 4)},
 (1, 1): {(0, 1), (1, 0), (1, 2), (2, 1)},
 (1, 2): {(0, 2), (1, 1), (1, 3), (2, 2)},
 (2, 0): {(1, 0), (2, 1), (3, 0)},
 (2, 2): {(1, 2), (2, 1), (2, 3), (3, 2)},
 (2, 3): {(1, 3), (2, 2), (2, 4), (3, 3)},
 (2, 4): {(1, 4), (2, 3), (3, 4)},
 (3, 0): {(2, 0), (3, 1)},
 (3, 1): {(2, 1), (3, 0), (3, 2)},
 (3, 3): {(2, 3), (3, 2), (3, 4)}}

Выше приведен словарь, который я получил из 2D-списка: ключи - значения кортежей (координат) - набор кортежей (координат)

Координатыячеек в 2D-списке.

Моя цель - сравнить значение данного ключа со следующим ключом.пример: сравнить {(0, 2), (0, 4), (1, 3)} с (0, 4).Если ключ присутствует в значении предыдущего ключа, то я хотел бы обновить первое значение значениями найденного ключа.Для приведенного примера: результат должен быть примерно таким: {(0, 2), (0, 4), (1, 3), (0, 3), (1, 4)}.

Я хотел бы знать, возможно ли это вообще?Есть ли способ сравнить значения словаря с ключами того же словаря?

Я тоже думал об использовании DFS, но у меня нет всех вершин для этого.Является ли DFS правильным подходом?

1 Ответ

1 голос
/ 17 июня 2019

Если вы хотите сделать это только с заданным значением ключа, вы можете сделать функцию для этого:

def get_value(data, key):
    keys = tuple(data)
    value = data[key]
    next_value = keys[keys.index(key)+1]
    next_value = data[next_value]

    return value | next_value if key in value else value | next_value

Вы можете использовать это так:

get_value(data, (0, 3))
#{(1, 3), (1, 4), (0, 4), (0, 3), (0, 2)}

Если вы хотите сделать это для всего слова, вы можете создать итератор предпросмотра и сравнить их следующим образом:

from itertools import zip_longest

data = {(0, 0): {(0, 1), (1, 0)},
 (0, 3): {(0, 2), (0, 4), (1, 3)},
 (0, 4): {(0, 3), (1, 4)},
 (1, 1): {(0, 1), (1, 0), (1, 2), (2, 1)},
 (1, 2): {(0, 2), (1, 1), (1, 3), (2, 2)},
 (2, 0): {(1, 0), (2, 1), (3, 0)},
 (2, 2): {(1, 2), (2, 1), (2, 3), (3, 2)},
 (2, 3): {(1, 3), (2, 2), (2, 4), (3, 3)},
 (2, 4): {(1, 4), (2, 3), (3, 4)},
 (3, 0): {(2, 0), (3, 1)},
 (3, 1): {(2, 1), (3, 0), (3, 2)},
 (3, 3): {(2, 3), (3, 2), (3, 4)}}

lookahead = iter(data.items()); next(lookahead)
for (k,v), (_k, _v) in zip_longest(data.items(), lookahead, fillvalue=(None,None)):
        if all((_k, _v)) and v >= {_k}:
                v |= _v

В результате:

{(0, 0): {(0, 1), (1, 0)},
 (0, 3): {(1, 3), (1, 4), (0, 4), (0, 3), (0, 2)},
 (0, 4): {(0, 3), (1, 4)},
 (1, 1): {(1, 3), (0, 2), (2, 1), (1, 0), (0, 1), (1, 2), (2, 2), (1, 1)},
 (1, 2): {(1, 3), (1, 1), (0, 2), (2, 2)},
 (2, 0): {(3, 0), (1, 0), (2, 1)},
 (2, 2): {(3, 2), (1, 3), (2, 1), (2, 3), (1, 2), (3, 3), (2, 2), (2, 4)},
 (2, 3): {(1, 3), (3, 3), (1, 4), (2, 3), (2, 2), (3, 4), (2, 4)},
 (2, 4): {(3, 4), (2, 3), (1, 4)},
 (3, 0): {(3, 2), (3, 0), (3, 1), (2, 1), (2, 0)},
 (3, 1): {(3, 0), (3, 2), (2, 1)},
 (3, 3): {(3, 4), (3, 2), (2, 3)}}

Примечание если вы используете python 3, у вас не должно возникнуть проблем с упорядочением, в противном случае безопаснее всего убедиться в том, что dict находится в правильном порядке, и использовать collections.OrderedDict, особенно в py2

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