python,字典值是对象,该对象是否可以从自身内部的函数访问自己的键值



我正在使用python中的字典,通过使用元组作为键来制作基本上是无限的2d数组

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]
请注意,如果对象在字典中

多次出现,它不会为您提供可实现的结果,如果对象不在字典中,它将引发异常。

在非常大的网格上也可能很慢。

您的问题意味着字典键与其值之间存在 1:1 的映射,这是不正确的。取以下代码:

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

这在python中是完全有效的,即使你的用例不允许它。您要查找的函数应该返回什么索引c

两次存储数据不一定是糟糕的编程风格,但您的内存可能有限。如果你的cell需要知道它的索引,它必须有该数据。如果您将单元格视为项目列表,则字典将仅成为索引,以便更快地访问。拥有索引以加快访问速度当然不是糟糕的编程风格。;-)

这里有两个单独的问题...首先,要从单元格内访问网格,我会让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模块。

最新更新