关联矩阵?
我正在做一个项目,需要存储一个用两个字符串作为键的数字矩阵。这个矩阵是规则的,也就是说,如果某一行有某个列的键,那么所有行都应该有这个列的键。同样的,如果某一列有某个行的键,那么所有列都应该有这个行的键。
最简单的表达方式是用一个关联数组(字典)里面再嵌套一个关联数组,但这样既不方便又效率低,而且无法保证矩阵的规则性。有没有流行的编程语言提供内置的关联矩阵,或者作为标准库的一部分?如果有的话,它们是怎么工作的,既包括使用的方式,也包括实现的细节?我在这个项目中使用的是Python和D语言,但其他语言的例子也很有用,因为我可以参考它们的API,找到在Python或D语言中实现类似功能的最佳方法。
3 个回答
0
在Python中,你可以用一个包含两个字符串的元组来作为字典的索引,比如:
>>> d = {}
>>> d["foo","bar"] = 10
>>> d
{('foo', 'bar'): 10}
我不太确定“强制不锯齿状”对你来说是什么意思,但你可以使用一个defaultdict,这样对于那些没有明确设置的条目,它会返回一个默认值,或者你可以用一个已知的值来初始化字典:
>>> xkeys = "abcdef"
>>> ykeys = "xyz"
>>> d = dict(((x,y), 0) for x in xkeys for y in ykeys)
>>> d
{('b', 'y'): 0, ('a', 'z'): 0, ('b', 'x'): 0, ('e', 'y'): 0, ('a', 'x'): 0, ('f', 'z'): 0, ('a', 'y'): 0, ('f', 'y'): 0, ('d', 'y'): 0, ('f', 'x'): 0, ('d', 'x'): 0, ('e', 'x'): 0, ('e', 'z'): 0, ('c', 'x'): 0, ('d', 'z'): 0, ('c', 'y'): 0, ('c', 'z'): 0, ('b', 'z'): 0}
如果你想确保只有在一个已知集合中的键是被允许的,那么我建议你可以通过继承字典来添加验证功能。
0
最近发布了一个叫做 larry 的Python模块。我觉得它可以满足你的需求。
2
为什么不直接用一个标准的矩阵呢?可以再加两个字典,一个把行的键转换成行的索引,另一个把列的键转换成列的索引。我觉得你可以很容易地自己做一个这样的结构。你只需要创建一个类,里面包含这个矩阵和两个字典,然后就可以开始使用了。