【发布时间】: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_time 和 dict_by_id,它们是字典的字典。 dict_by_time 将时间戳 t 映射到一个 id 字典,每个 id 都指向一个状态。类似地,dict_by_id 将一个 id 映射到一个时间戳字典,每个时间戳都指向一个状态。这样我就可以访问我喜欢的一个状态或一组状态。请注意,两个 dicts 的“叶子”(dict_by_time 和 dict_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