Для начала с
Ускорить поиск по словарю, так что это не будет проблемой
Поиск по словарю довольно быстрый O (1), но (сВаш другой вопрос) вы не полагаетесь на поиск по хэш-таблице в словаре, вы полагаетесь на линейный поиск ключей словаря.
Найдите какой-то контейнер, который будет поддерживать разреженный, отрицательныйиндексы?
Это не индексируется в словаре.Кортеж является неизменным объектом, и вы хэшируете кортеж в целом.Словарь действительно не имеет представления о содержимом ключей, только их хэш.
Я собираюсь предложить, как и другие, что вы реструктурируете свои данные.
Например, вы можете создавать объекты, которые инкапсулируют нужные вам данные, и упорядочивать их в двоичном дереве для поиска O (n lg n).Вы даже можете зайти так далеко, чтобы обернуть все это в класс, который даст вам красивый синтаксис if foo in Bar:
, который вы ищете.
Вам, вероятно, нужна пара скоординированных структур, чтобы выполнить то, что вы хотите.Вот упрощенный пример с использованием диктов и наборов (немного подправив предложение пользователя 6502.)
# this will be your dict that holds all the data
matrix = {}
# and each of these will be a dict of sets, pointing to coordinates
cols = {}
rows = {}
def add_data(coord, data)
matrix[coord] = data
try:
cols[coord[0]].add(coord)
except KeyError:
# wrap coords in a list to prevent set() from iterating over it
cols[coord[0]] = set([coord])
try:
rows[coord[1]].add(coord)
except KeyError:
rows[coord[1]] = set([coord])
# now you can find all coordinates from a row or column quickly
>>> add_data((2, 7), "foo4")
>>> add_data((2, 5), "foo3")
>>> 2 in cols
True
>>> 5 in rows
True
>>> [matrix[coord] for coord in cols[2]]
['foo4', 'foo3']
Теперь просто оберните это в классе или модуле, и вы будете выключены, и, как всегда, если этонедостаточно быстрый профиль и тестирование, прежде чем угадать.