【问题标题】:Python3 - Access multikey dict with single keyPython3 - 使用单键访问多键字典
【发布时间】:2019-11-07 05:30:29
【问题描述】:

我想将时间戳t 和标识符id 映射到对象的某个状态。我可以通过映射元组 (t,id) -> state_of_id_in_t 来做到这一点。我可以使用这个映射来访问一个特定的(t,id) 组合。

但是,有时我想知道特定id(即id -> a set of (t, state_of_id_in_t))的所有状态(具有匹配的时间戳t),有时我想知道特定时间戳@987654330 的所有状态(具有匹配的标识符id) @(即t -> a set of (id, state_of_id_in_t))。问题是我不能将所有这些都放在一个大矩阵中并根据我想要的进行线性搜索。我拥有状态的(t,id) 元组的数量非常大(1m +)并且非常稀疏(一些时间戳有很多状态,其他没有等等)。如何制作这样一个可以处理通过部分键访问其内容的字典?

我创建了两个不同的字典 dict_by_timedict_by_id,它们是字典的字典。 dict_by_time 将时间戳 t 映射到一个 id 字典,每个 id 都指向一个状态。类似地,dict_by_id 将一个 id 映射到一个时间戳字典,每个时间戳都指向一个状态。这样我就可以访问我喜欢的一个状态或一组状态。请注意,两个 dicts 的“叶子”(dict_by_timedict_by_id)都指向相同的对象,所以这只是我访问不同状态的方式,但状态本身是相同的 python 对象。

dict_by_time = {'t_1': {'id_1': 'some_state_object_1',
                        'id_2': 'some_state_object_2'},
                't_2': {'id_1': 'some_state_object_3',
                        'id_2': 'some_state_object_4'}


dict_by_id = {'id_1': {'t_1': 'some_state_object_1',
                       't_2': 'some_state_object_3'},
              'id_2': {'t_1': 'some_state_object_2',
                       't_2': 'some_state_object_4'}

同样,请注意叶子在两个字典之间共享。

我认为使用两个 dicts 并不好,因为在添加新的时间戳或标识符时同时维护它们会导致双重工作,并且当我做错事时很容易导致不一致。有没有更好的方法来解决这个问题?复杂性非常重要,这就是为什么我不能只进行手动搜索而需要使用某种 HashMap 魔法。

【问题讨论】:

  • 听起来你需要一个数据库。这将是基本 SQL。
  • 是的,我基本上是在寻找一种方法来“索引”两列。不幸的是,SQL 超出了范围。这些计算在内存中完成以进行实时可视化。

标签: python-3.x dictionary multikey


【解决方案1】:

您总是可以用查找复杂性来换取增加复杂性。您可以使用add 方法和lookup 方法创建一个类,而不是使用单个字典。在内部,您可以使用 3 个不同的字典来跟踪数据。一个使用(t,id) 元组作为键,一个使用t 作为键,一个使用id 作为键。根据提供给lookup 的参数,您可以从其中一个字典返回结果。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多