比较同一字典中的键和值
Compare keys and values within the same dictionary
{(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)}}
以上是我从二维列表中得到的字典:
键——元组(坐标)
值 -- 元组集(坐标)
坐标是二维列表中的单元格。
我的目标是将给定键的值与下一个键进行比较。
示例:将 {(0, 2), (0, 4), (1, 3)}
与 (0, 4)
进行比较。
如果该键存在于前一个键的值中,那么我想用找到的键的值更新第一个值。对于给定的示例:结果应该类似于:{(0, 2), (0, 4), (1, 3), (0, 3), (1, 4)}
.
我想知道这是否可能?有没有办法将字典的值与同一字典的键进行比较?
我也在考虑使用 DFS,但我没有所有的顶点。 DFS 是正确的方法吗?
如果您只想对给定的键值执行此操作,那么您可以创建一个函数来执行此操作:
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
{(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)}}
以上是我从二维列表中得到的字典: 键——元组(坐标) 值 -- 元组集(坐标)
坐标是二维列表中的单元格。
我的目标是将给定键的值与下一个键进行比较。
示例:将 {(0, 2), (0, 4), (1, 3)}
与 (0, 4)
进行比较。
如果该键存在于前一个键的值中,那么我想用找到的键的值更新第一个值。对于给定的示例:结果应该类似于:{(0, 2), (0, 4), (1, 3), (0, 3), (1, 4)}
.
我想知道这是否可能?有没有办法将字典的值与同一字典的键进行比较?
我也在考虑使用 DFS,但我没有所有的顶点。 DFS 是正确的方法吗?
如果您只想对给定的键值执行此操作,那么您可以创建一个函数来执行此操作:
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