我在python中使用字典通过使用元组作为键来制作基本上是无限的二维数组
grid = {}
grid[(0,0)] = cell()
值“单元格”是一个新对象。例如,我可以在该对象中拥有一个能够获取其键值的函数吗?IE。(0,0)
我可以将这些数据放在对象本身中,但是我会让它存在两次,这似乎是糟糕的编程。谢谢!
我在python中使用字典通过使用元组作为键来制作基本上是无限的二维数组
grid = {}
grid[(0,0)] = cell()
值“单元格”是一个新对象。例如,我可以在该对象中拥有一个能够获取其键值的函数吗?IE。(0,0)
我可以将这些数据放在对象本身中,但是我会让它存在两次,这似乎是糟糕的编程。谢谢!
class cell(object):
def my_idx(self,grid):
return grid.keys()[grid.values().index(self)]
然后调用它
some_cell.my_idx(grid)
这里有两个单独的问题...首先,要从单元格内访问网格,我会让cell
's 的构造函数将对网格的引用作为强制参数。
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()
方法返回它。
这应该有效:
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 键与其值之间存在 1:1 映射,这是不正确的。拿这个代码:
grid = {}
c = cell()
grid[(0,0)] = c
grid[(0,1)] = c
这在 python 中是完全有效的,即使您的用例不允许这样做。您正在寻找的函数应该返回什么索引c
?
两次存储数据不一定是糟糕的编程风格,但您的内存可能会受到限制。如果您cell
需要知道它的索引,它必须具有该数据。如果您将单元格视为项目列表,则 dict 将成为更快访问的索引。拥有更快访问的索引当然不是不好的编程风格。;-)
给你的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
的 s 还需要知道和/或做什么,但如果你只是在这里做数字的东西,我强烈推荐scipy.sparse模块。