python - 在 Python 中从一对或名称映射到一个值

标签 python arrays dictionary

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

相关文章:

python - 如何在 JSON 中保存元素的位置

python - 解析 XML 时出现 xml.parsers.expat.ExpatError

python - 如何在 Windows 上为 Python 3.7 安装 Splunklib?

c++ - 我可以有一个跳过索引的一维 bool 数组吗?

python - 如何根据条件更新多个字典值?

python - 查找列表中的字典项

python - 比较 pandas.Series 在不同顺序时的相等性

python - Poco,子通信挂起(python解释器是子)

Javascript onclick 附件索引器问题

arrays - Swift 数组字典、数据结构