Pythonで辞書を使用して、タプルをキーとして使用して、基本的に無限の2D配列を作成しています。
grid = {}
grid[(0,0)] = cell()
値'cell'は新しいオブジェクトです。たとえば、そのオブジェクト内に、そのキー値を取得できる関数を含めることはできますか?すなわち。(0,0)
そのデータをオブジェクト自体に入れることもできますが、その場合は2回存在することになり、プログラミングが悪いように見えます。ありがとう!
Pythonで辞書を使用して、タプルをキーとして使用して、基本的に無限の2D配列を作成しています。
grid = {}
grid[(0,0)] = cell()
値'cell'は新しいオブジェクトです。たとえば、そのオブジェクト内に、そのキー値を取得できる関数を含めることはできますか?すなわち。(0,0)
そのデータをオブジェクト自体に入れることもできますが、その場合は2回存在することになり、プログラミングが悪いように見えます。ありがとう!
class cell(object):
def my_idx(self,grid):
return grid.keys()[grid.values().index(self)]
それからそれを呼ぶ
some_cell.my_idx(grid)
これは機能するはずです:
class Cell(object):
def get_idx(self, grid):
"""
>>> cell = Cell()
>>> cell.get_idx({(0, 0): cell})
(0, 0)
>>> cell = Cell()
>>> cell.get_idx({(0, 0): Cell(), (1, 1): cell, (2, 2): Cell()})
(1, 1)
"""
return [x[0] for x in grid.items() if x[1] == self][0]
オブジェクトがdictに複数回存在する場合は実現可能な結果が得られず、オブジェクトがdictに含まれていない場合は例外が発生することに注意してください。
また、非常に大きなグリッドでは遅くなる可能性があります。
あなたの質問は、dictキーとその値の間に1:1のマッピングがあることを意味しますが、これは真実ではありません。このコードを取る:
grid = {}
c = cell()
grid[(0,0)] = c
grid[(0,1)] = c
ユースケースで許可されていない場合でも、Pythonでは完全に有効です。探している関数はどのインデックスを返す必要がありc
ますか?
データを2回保存することは、悪いプログラミングスタイルである必要はありませんが、メモリが制限される可能性があります。cell
インデックスを知る必要がある場合は、そのデータが必要です。セルをアイテムのリストとして表示する場合、dictはアクセスを高速化するための単なるインデックスになります。そして、より高速なアクセスのためのインデックスを持つことは、もちろん悪いプログラミングスタイルではありません。;-)
ここには2つの別々の問題があります...最初に、セル内からグリッドにアクセスするには、cell
コンストラクターにグリッドへの参照を必須の引数として取得させる必要があります。
grid = {}
grid[(0,0)] = cell(grid)
と
class cell:
def __init__(self, gridRef):
self.grid = gridRef
ただし、キーへのアクセスはより困難です。1つの理由は、ディクショナリが1対1のマッピングではないため、同じセルオブジェクトがディクショナリに複数のキーを持っている可能性があることです。手動で、または辞書をめくって、キーを繰り返し処理して探す必要があります。cell
コンストラクターにもキーを取得させるのはどうですか?
grid = {}
grid[(0,0)] = cell(grid, (0,0))
それが冗長すぎる場合は、おそらくこのようなものですか?
def addToGrid(myDict, myCell):
myDict[myCell.key()] = myCell
その後...
grid = {}
addToGrid(grid, cell(grid, (0, 0)))
ここで、cell
クラスは2番目の引数として辞書キーを取り、key()
メソッドを介してそれを返します。
cell
クラスに属性を指定しますaddress
。これは2タプルです(例:)(0,0)
。cell
クラスに。__hash__
を返すメソッドを与えますhash(self.address)
。
class cell:
def __init__(self,address):
self.address = address
def __hash__(self):
return hash(self.address)
def __eq__(self):
return hash(self) == hash(other)
アドレスでセルにアクセスすることはできますが、セルはそれらがどこに属しているかを知っています。
>>> c = cell((0,0))
>>> c
<so.cell instance at 0xb74c6a2c>
>>> grid = dict()
>>> grid[c] = c
>>> grid[c]
<so.cell instance at 0xb74c6a2c>
>>> grid[(0,0)]
<so.cell instance at 0xb74c6a2c>
他に何cell
を知っているか、または何をする必要があるかはわかりませんが、ここで数値的なことをしているだけの場合は、scipy.sparseモジュールを強くお勧めします。