我有一个应用程序,其中有一组命名节点。对于每对节点,我想存储它们的连接性值。节点会随着时间的流逝而变化,所以我无法初始化一个“数组”。名称不是连续的整数,而是任意的对象ID或字符串名称。
我需要能够:
lookup(name1, name2) -> value
并且
set(name1, name2, value)
并且,当新节点加入时,执行以下操作:
set(newname, [all other nodes], default_value)
假设对于每一对,方向都没有关系。即(name1,name2)应该具有与(name2,name1)相同的值。
最明显的Python实现似乎是两级字典:
{ name1 : { name2: value, name3:value}, name2: {name1:value, name3:value}, ... etc. }
这是最好的方法吗?
更新
在Python内部使用双对字典作为键的建议可能更好。但是,我也发现有一个矛盾,可以将数据集作为列表列表导出和导入(以支持Simics模拟器中状态的序列化),为此,两级映射是很自然但是我想这对夫妇也可以在那里工作。实际上,很难说出什么更好。
最佳答案
您可以使用frozenset()
键:
{frozenset([name1, name2]): value, frozenset([name2, name3]): other_value}
优点是
frozenset()
对象可以用作键,并且节点的顺序无关紧要; frozenset([name1, name2])
等于frozenset([name2, name1])
。要获得所有节点的列表,您必须使用:
all_nodes = reduce(frozenset.union, yourdict.keys())
如果这是Python 2,请改用
yourdict.iterkeys()
。然后,您可以从此处产生所有可能的组合,以设置默认值:from itertools import permutations:
for name1, name2 in permutations(all_nodes, r=2):
key = frozenset([name1, name2])
if key not in yourdict:
yourdict[key] = default_value
另外,如果将整个结构包装在一个类中(可能是个好主意),则可以添加一个附加索引来跟踪使用的节点,并在更新实例时使该索引保持最新。
关于python - 从对或名称映射到Python中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21480411/