![](/img/trans.png)
[英]Is it normal to use an object as its own key in a dictionary/hashmap (in 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.