簡體   English   中英

python,字典值是對象,該對象可以從自身內部的函數訪問其自己的鍵值嗎?

[英]python, dictionary value is object, can that object access its own key value from a function within itself?

我正在使用python中的字典,通過使用元組作為鍵來制作基本上是無限的2d數組

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

值“ cell”是一個新對象。 我可以說該對象中有一個能夠獲取其鍵值的函數嗎? 即。 (0,0)

我可以將這些數據放在對象本身中,但是然后我將它存在兩次,這似乎是不好的編程。 謝謝!

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]

請注意,如果對象在字典中不止一次,它將不會給您帶來可實現的結果;如果對象不在字典中,它將引發異常。

同樣,在非常大的網格上它可能會變慢。

您的問題意味着字典鍵和它們的值之間存在1:1的映射,這是不正確的。 采取以下代碼:

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

即使在用例不允許的情況下,這在python中也是完全有效的。 您要尋找的函數應該為c返回什么索引?

兩次存儲數據不一定是不好的編程風格,但是您的內存可能有限。 如果您的cell需要知道它的索引,則必須具有該數據。 如果您將單元格視為項目列表,則dict只是索引,可加快訪問速度。 並且擁有索引以實現更快的訪問當然不是不好的編程風格。 ;-)

這里有兩個獨立的問題...首先,要從單元內部訪問網格,我將讓cell的構造函數將對網格的引用作為強制參數。

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

class cell:
  def __init__(self, gridRef):
    self.grid = gridRef

但是,訪問密鑰更具挑戰性。 原因之一是詞典不是一對一的映射,因此同一個單元格對象在詞典中可能有多個鍵。 您需要手動或通過翻轉字典來遍歷鍵並尋找它。 如何使您的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類將字典鍵作為第二個參數,並通過key()方法返回它。

給您的cell類一個address屬性,該屬性是一個二元組,例如(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模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM