Если вы хотите сделать это только с заданным значением ключа, вы можете сделать функцию для этого:
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