我正在尝试创建一个很好的界面来访问数据集,其中每个值都有几个可能的键。例如,假设我对数据集中的每个值都有 number 和 name 。我希望能够使用数字或名称访问每个值。
我考虑了几种可能的实施方式:
使用两个单独的词典,一个用于按编号组织的数据值,另一个用于按名称组织的数据值。
只需将两个键分配给字典中的相同值即可。
创建将每个名称映射到相应数字的词典,反之亦然
尝试创建将每个名称映射到数字等的哈希函数(与上述相关)
创建一个对象来封装所有三个数据,然后使用一个键将字典键映射到对象,只需搜索字典就可以将另一个键映射到对象。
这些似乎都不理想。第一个似乎是丑陋和不可维护的。第二个似乎也很脆弱。第三个/第四个似乎是合理的,但似乎需要很多手动规范或过于复杂的实现。最后,第五个失去了其中一个查找的恒定时间性能。
在C / C ++中,我相信我会使用指针从不同的键引用相同的数据。
我知道问题非常类似于非键列的数据库查找问题,但是,我希望(如果可能的话)维护Python字典的近似O(1)性能。
实现这种数据结构的Pythonic方法是什么?
答案 0 :(得分:5)
In C/C++, I believe that I would use pointers to reference the same piece of
data from different keys.
这与选项号2相对应。在Python中,词典实际上存储了指向对象的指针。这意味着让两个键指向同一个对象不会两次创建对象。
答案 1 :(得分:1)
名称和号码都是唯一的吗?首先,使用一个找到另一个,并不是那么糟糕。
指向相同数据的两个词典(如C语言)不会复制数据,也很好。
将两个dictonaries封装到一个包含add(name,number,value)
和findByName(name)
,findByNumber(number)
的自包含对象中,可以让您集中维护,可测试&等等。
(原谅我的camelCase:)
答案 2 :(得分:1)
以这种方式看待它:你本质上想要拥有一个三列数据库,其中两列被索引,但简化了你不希望能够查找索引值。
选项5实际上是在尝试制作这样一个简化的数据库。在内存中创建这样的数据库时最终得到的是从UID到您拥有的值的映射(在这种情况下只有一个,因为您只有一个值“column”),并且索引从值映射到UID
在您的情况下,您已经拥有一个可以用作UID的号码,因此您不需要“列”。
这意味着您最终得到两个字典:一个映射数字到值,一个映射名称到数字。
所以这就是你应该做的,IMO。
答案 3 :(得分:1)
在C / C ++中,我相信我会使用指针来引用不同键中的同一段数据。
Python中几乎任何东西都有资格作为“C / C ++指针”。
使用您的选项#1,两个词典,并测试它的性能。如果为内容定义一个类,那么构造函数和析构函数可以管理字典,类可以为查找定义函数。