から始めるには
辞書の検索を高速化するので、これは問題になりません
辞書の検索は非常に高速ですO(1)ですが、(他の質問から)辞書のハッシュテーブル検索に依存しておらず、辞書のキーの線形検索に依存しています。
スパースな負のインデックスをサポートするコンテナの種類を見つけますか?
これは辞書に索引付けされていません。タプルは不変オブジェクトであり、タプル全体をハッシュしています。辞書は実際にはキーの内容を認識しておらず、ハッシュだけを認識しています。
他の人がしたように、データを再構築することをお勧めします。
たとえば、必要なデータをカプセル化するオブジェクトを作成し、それらをO(n lg n)検索用のバイナリツリーに配置できます。if foo in Bar:
探している素晴らしい構文を提供するクラスですべてをラップすることもできます。
あなたが望むことを達成するために、おそらくいくつかの調整された構造が必要です。これは、dictとsetsを使用した単純化された例です(ユーザー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']
これをクラスまたはモジュールでラップするだけで、オフになります。いつものように、プロファイルが十分に速くない場合は、推測する前にテストしてください。