Я хочу сопоставить отметку времени 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_time
и dict_by_id
, которые являются диктовками диктов. dict_by_time
сопоставляет временную метку t
с указанием идентификаторов, каждый из которых указывает на состояние. Аналогично, dict_by_id
сопоставляет идентификатор с указанием временных отметок, каждая из которых указывает на состояние. Таким образом, я могу получить доступ к состоянию или набору состояний, как мне нравится. Обратите внимание, что «листы» обоих диктов (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'}
Опять же, обратите внимание, что листы распределяются между обоими диктовками.
Я не думаю, что это хорошо делать с использованием двух диктов, просто потому, что поддержание их обоих при добавлении новых меток времени или идентификаторов приводит кв двойной работе и может легко привести к несоответствиям, когда я делаю что-то не так. Есть ли лучший способ решить эту проблему? Сложность очень важна, поэтому я не могу просто выполнить ручной поиск, и мне нужно использовать какую-то магию HashMap.