0

Pythonで辞書を使用して、タプルをキーとして使用して、基本的に無限の2D配列を作成しています。

grid = {}
grid[(0,0)] = cell()

値'cell'は新しいオブジェクトです。たとえば、そのオブジェクト内に、そのキー値を取得できる関数を含めることはできますか?すなわち。(0,0)

そのデータをオブジェクト自体に入れることもできますが、その場合は2回存在することになり、プログラミングが悪いように見えます。ありがとう!

4

5 に答える 5

1
class cell(object):
     def my_idx(self,grid):
         return grid.keys()[grid.values().index(self)]

それからそれを呼ぶ

some_cell.my_idx(grid)
于 2012-10-11T20:55:16.083 に答える
1

これは機能するはずです:

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に含まれていない場合は例外が発生することに注意してください。

また、非常に大きなグリッドでは遅くなる可能性があります。

于 2012-10-11T21:08:10.237 に答える
1

あなたの質問は、dictキーとその値の間に1:1のマッピングがあることを意味しますが、これは真実ではありません。このコードを取る:

grid = {}
c = cell()
grid[(0,0)] = c
grid[(0,1)] = c

ユースケースで許可されていない場合でも、Pythonでは完全に有効です。探している関数はどのインデックスを返す必要がありcますか?

データを2回保存することは、悪いプログラミングスタイルである必要はありませんが、メモリが制限される可能性があります。cellインデックスを知る必要がある場合は、そのデータが必要です。セルをアイテムのリストとして表示する場合、dictはアクセスを高速化するための単なるインデックスになります。そして、より高速なアクセスのためのインデックスを持つことは、もちろん悪いプログラミングスタイルではありません。;-)

于 2012-10-11T21:09:41.590 に答える
1

ここには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()メソッドを介してそれを返します。

于 2012-10-11T21:10:43.137 に答える
0

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モジュールを強くお勧めします。

于 2012-10-11T21:10:00.170 に答える