我在python中使用字典,通过使用元组作为键来制作基本上无限的2d数组
grid = {}
grid[(0,0)] = cell()
值'cell'是一个新对象。比方说,我可以在该对象中获得能够获得其键值的函数吗?即。 (0,0)
我可以将这些数据放在对象本身中,但之后我会将它存在两次,这似乎是错误的编程。谢谢!
答案 0 :(得分:1)
class cell(object):
def my_idx(self,grid):
return grid.keys()[grid.values().index(self)]
然后调用它
some_cell.my_idx(grid)
答案 1 :(得分: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]
请注意,如果对象在dict中不止一次,它将不会给你可靠的结果,如果对象不在dict中,它会引发异常。
在非常大的网格上也可能很慢。
答案 2 :(得分:1)
你的问题意味着dict键和它们的值之间存在1:1的映射,这是不正确的。拿这个代码:
grid = {}
c = cell()
grid[(0,0)] = c
grid[(0,1)] = c
即使你的用例不允许,它在python中也是完全有效的。您要查找的函数应返回c
?
存储数据两次不一定是错误的编程风格,但您的内存可能有限。如果您的cell
需要知道它的索引,那么它必须包含该数据。如果您将单元格视为项目列表,则dict将成为更快访问的索引。拥有索引以便更快地访问当然也没有错误的编程风格。 ; - )
答案 3 :(得分:1)
这里有两个不同的问题......首先,要从单元格内部访问网格,我会让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()
方法返回。
答案 4 :(得分: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模块。< / p>