Python中值对应多个键的字典
我正在尝试创建一个友好的界面来访问一个数据集,这个数据集里的每个值都有几个可能的键。举个例子,假设我为数据集中的每个值都有一个数字和一个名字。我希望能够通过数字或名字来访问每个值。
我考虑了几种可能的实现方式:
使用两个独立的字典,一个按数字组织数据值,另一个按名字组织数据值。
在一个字典中简单地给同一个值分配两个键。
创建字典,将每个名字映射到对应的数字,反之亦然。
尝试创建一个哈希函数,将每个名字映射到一个数字,等等(与上面相关)。
创建一个对象来封装这三部分数据,然后用一个键将字典键映射到这些对象,再通过搜索字典将另一个键映射到对象。
这些方案似乎都不太理想。第一个方案看起来很麻烦,维护起来也不方便。第二个方案也显得脆弱。第三和第四个方案看起来可行,但似乎需要大量手动指定或者实现过于复杂。最后,第五个方案在查找时失去了常量时间的性能。
在C/C++中,我觉得我会使用指针来通过不同的键引用同一块数据。
我知道这个问题与通过非键列进行数据库查找的问题相似,但我希望(如果可能的话)保持Python字典大约O(1)的性能。
实现这个数据结构最符合Python风格的方法是什么呢?
4 个回答
可以这样理解:你想要的是一个有三列的数据库,其中两列是有索引的,但你希望简化一下,不想查找那些有索引的值。
选项5实际上是在尝试创建这样一个简化的数据库。当你在内存中创建这样的数据库时,结果就是一个UID(唯一标识符)到你拥有的值的映射(在这个例子中只有一个值,因为你只有一列值),而索引则是从值到UID的映射。
在你的情况下,你已经有一个可以用作UID的数字,所以你不需要为此再创建一列。
这意味着你最终会得到两个字典:一个是数字到值的映射,另一个是名字到数字的映射。
所以在我看来,这就是你应该做的。
名字和号码都是独一无二的吗?用一个去找另一个,其实也没那么糟糕。
在C语言中,两个字典指向同一份数据,这样不会重复存储数据,这样做也是可以的。
把这两个字典封装成一个独立的对象,里面有 add(name,number,value)
和 findByName(name)
、findByNumber(number)
这些方法,可以让你更方便地管理,测试起来也简单等等。
(请原谅我用驼峰命名法 :)
In C/C++, I believe that I would use pointers to reference the same piece of
data from different keys.
这对应的是第二个选项。在Python中,字典实际上是存储指向对象的指针。这意味着如果有两个键指向同一个对象,就不会重复创建这个对象。