Python中每个值具有多个键的字典

时间:2011-01-15 05:02:46

标签: python data-structures map

我正在尝试创建一个很好的界面来访问数据集,其中每个值都有几个可能的键。例如,假设我对数据集中的每个值都有 number name 。我希望能够使用数字或名称访问每个值。

我考虑了几种可能的实施方式:

  1. 使用两个单独的词典,一个用于按编号组织的数据值,另一个用于按名称组织的数据值。

  2. 只需将两个键分配给字典中的相同值即可。

  3. 创建将每个名称映射到相应数字的词典,反之亦然

  4. 尝试创建将每个名称映射到数字等的哈希函数(与上述相关)

  5. 创建一个对象来封装所有三个数据,然后使用一个键将字典键映射到对象,只需搜索字典就可以将另一个键映射到对象。

  6. 这些似乎都不理想。第一个似乎是丑陋和不可维护的。第二个似乎也很脆弱。第三个/第四个似乎是合理的,但似乎需要很多手动规范或过于复杂的实现。最后,第五个失去了其中一个查找的恒定时间性能。

    在C / C ++中,我相信我会使用指针从不同的键引用相同的数据。

    我知道问题非常类似于非键列的数据库查找问题,但是,我希望(如果可能的话)维护Python字典的近似O(1)性能。

    实现这种数据结构的Pythonic方法是什么?

4 个答案:

答案 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,两个词典,并测试它的性能。如果为内容定义一个类,那么构造函数和析构函数可以管理字典,类可以为查找定义函数。