{(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是正确的方法吗?
答案 0 :(得分:1)
如果只想对给定的键值执行此操作,则可以使函数执行此操作:
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,则排序应该不会有问题,否则最安全的是确保字典顺序正确并使用collections.OrderedDict
,尤其是在py2 < / p>