【问题标题】:Dictionaries with more than one key per value in PythonPython中每个值具有多个键的字典
【发布时间】:2011-06-09 13:05:33
【问题描述】:

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

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

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

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

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

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

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

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

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

我知道这个问题与非键列的数据库查找问题非常相似,但是,我希望(如果可能的话)保持 Python 字典的近似 O(1) 性能。

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

【问题讨论】:

    标签: python data-structures map


    【解决方案1】:

    名称和编号都是唯一的吗?首先,使用一个来找到另一个并不是那么糟糕。

    两个指向相同数据的字典,就像在 C 中一样,不会复制数据,也很好。

    用add(name,number,value)和findByName(name)、findByNumber(number)将这两个字典封装成一个独立的对象,可以让您集中维护、可测试等等。

    (请原谅我的骆驼案:)

    【讨论】:

      【解决方案2】:
      In C/C++, I believe that I would use pointers to reference the same piece of 
      data from different keys.
      

      这将对应于选项号 2。在 Python 中,字典确实存储指向对象的指针。这意味着拥有两个指向同一个对象的键不会创建该对象两次。

      【讨论】:

        【解决方案3】:

        这样看:本质上,您希望拥有一个三列数据库,其中两列被索引,但简单地说,您不希望能够查找索引值。

        选项 5 在实践中试图制作这样一个简化的数据库。在内存中创建这样一个数据库时,您最终得到的是从 UID 到您拥有的值的映射(在这种情况下,只有一个,因为您只有一个值“列”),并且索引是从值到 UID 的映射.

        在您的情况下,您已经有一个可用作 UID 的数字,因此您不需要“列”。

        这意味着您最终会得到两个字典:一个将数字映射到值,另一个将名称映射到数字。

        所以这是你应该做的,IMO。

        【讨论】:

          【解决方案4】:

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

          Python 中的几乎所有内容都可以称为“C/C++ 指针”。

          使用您的选项#1,两个字典,并测试它的性能。如果您为内容定义一个类,那么构造函数和析构函数可以管理字典,并且该类可以为查找定义函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-19
            • 1970-01-01
            • 1970-01-01
            • 2020-12-27
            相关资源
            最近更新 更多