我使用的字典在Python做什麼基本上是通過使用一個元組作爲重點python,字典值是對象,那個對象可以從它自己的函數中訪問它自己的鍵值嗎?
grid = {}
grid[(0,0)] = cell()
值「細胞」無限二維數組是一個新的對象。我可以在該對象中具有能夠獲得其關鍵值的函數嗎?即。 (0,0)
我可以把這些數據放在對象本身中,但是我會讓它存在兩次,這看起來是不好的編程。謝謝!
我使用的字典在Python做什麼基本上是通過使用一個元組作爲重點python,字典值是對象,那個對象可以從它自己的函數中訪問它自己的鍵值嗎?
grid = {}
grid[(0,0)] = 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]
只需注意它不會給你realiable的結果,如果對象是不止一次在字典和如果該對象不在字典中,它會引發異常。
此外,它可能會很慢,非常大的網格。
你的問題意味着在dict鍵和它們的值之間有1:1的映射,這是不正確的。拿這個代碼:
grid = {}
c = cell()
grid[(0,0)] = c
grid[(0,1)] = c
即使你的用例不允許它在python中是完全有效的。您正在尋找的功能的索引應返回c
?
兩次存儲數據不一定是錯誤的編程風格,但是你的內存可能有限。如果你的cell
需要知道它的索引,它必須有這些數據。如果您將單元格視爲項目列表,則字典只會成爲更快訪問的索引。並且有更快訪問的索引當然沒有不好的編程風格。 ;-)
爲您的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模塊。
它的確定稀疏,因爲網格是無限的!即。我想能夠去[[(1000000,1000000000000)] = cell()如果我想 –
謝謝,我錯過了「無限」數組部分。我編輯了這個問題。 –
這裏有兩個單獨的問題......首先,要訪問單元格內的網格,我會讓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()
方法返回。
'grid'是一個字典。它沒有'index'方法。 – mgilson
是的,我認爲是這樣,我得到了一個錯誤'字典'沒有屬性'索引' –
哦哎呀...我會修復它.. K固定對不起:P –