我有一个应用程序,其中有一组命名节点。对于每对节点,我想存储它们的连接性值。节点会随着时间的流逝而变化,所以我无法初始化一个“数组”。名称不是连续的整数,而是任意的对象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/

10-11 22:26
查看更多