python,字典值是对象,该对象可以从其自身的函数中访问自己的键值吗?

时间:2012-10-11 20:52:54

标签: python object dictionary key

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

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

值'cell'是一个新对象。比方说,我可以在该对象中获得能够获得其键值的函数吗?即。 (0,0)

我可以将这些数据放在对象本身中,但之后我会将它存在两次,这似乎是错误的编程。谢谢!

5 个答案:

答案 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>