Python3-使用单键访问多键字典

问题描述 投票:0回答:1

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

但是,有时我想知道特定t(即id)的所有状态(带有匹配的时间戳id -> a set of (t, state_of_id_in_t)),有时还想知道特定时间戳id的所有状态(带有匹配的标识符t) (即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映射到时间戳的字典,每个时间戳都指向一个状态。这样我就可以访问一个状态或一组状态。请注意,两个字典(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'}

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

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

python-3.x dictionary multikey
1个回答
1
投票

您始终可以将添加复杂度与查找复杂度进行交易。您可以使用add方法和lookup方法来创建类,而不是使用单个字典。在内部,您可以使用3个不同的字典来跟踪数据。一个使用(t,id)元组作为键,一个使用t作为键,一个使用id作为键。根据lookup的自变量,您可以从其中一个字典中返回结果。

© www.soinside.com 2019 - 2024. All rights reserved.