比较同一词典中的键和值

时间:2019-06-17 05:11:53

标签: python python-3.x dictionary depth-first-search

{(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 个答案:

答案 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>

相关问题