Python3 - доступ к многопользовательскому режиму с одним ключом - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу сопоставить отметку времени 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.

1 Ответ

1 голос
/ 07 ноября 2019

Вы всегда можете обменять сложность на сложность поиска. Вместо того, чтобы использовать один dict, вы можете создать класс с методом add и методом lookup. Внутри вы можете отслеживать данные, используя 3 разных словаря. Один использует (t,id) кортеж в качестве ключа, один использует t в качестве ключа и один использует id в качестве ключа. В зависимости от аргументов, заданных lookup, вы можете вернуть результат из одного из словарей.

...