2012-10-11 35 views
0

我使用的字典在Python做什麼基本上是通過使用一個元組作爲重點python,字典值是對象,那個對象可以從它自己的函數中訪問它自己的鍵值嗎?

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

值「細胞」無限二維數組是一個新的對象。我可以在該對象中具有能夠獲得其關鍵值的函數嗎?即。 (0,0)

我可以把這些數據放在對象本身中,但是我會讓它存在兩次,這看起來是不好的編程。謝謝!

回答

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

然後調用它

some_cell.my_idx(grid) 
+1

'grid'是一個字典。它沒有'index'方法。 – mgilson

+0

是的,我認爲是這樣,我得到了一個錯誤'字典'沒有屬性'索引' –

+0

哦哎呀..​​.我會修復它.. K固定對不起:P –

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] 

只需注意它不會給你realiable的結果,如果對象是不止一次在字典和如果該對象不在字典中,它會引發異常。

此外,它可能會很慢,非常大的網格。

1

你的問題意味着在dict鍵和它們的值之間有1:1的映射,這是不正確的。拿這個代碼:

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

即使你的用例不允許它在python中是完全有效的。您正在尋找的功能的索引應返回c

兩次存儲數據不一定是錯誤的編程風格,但是你的內存可能有限。如果你的cell需要知道它的索引,它必須有這些數據。如果您將單元格視爲項目列表,則字典只會成爲更快訪問的索引。並且有更快訪問的索引當然沒有不好的編程風格。 ;-)

0

爲您的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模塊。

+0

它的確定稀疏,因爲網格是無限的!即。我想能夠去[[(1000000,1000000000000)] = cell()如果我想 –

+0

謝謝,我錯過了「無限」數組部分。我編輯了這個問題。 –

1

這裏有兩個單獨的問題......首先,要訪問單元格內的網格,我會讓cell的構造函數將grid引用爲強制參數。

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()方法返回。

相關問題