0

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

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

值“单元格”是一个新对象。例如,我可以在该对象中拥有一个能够获取其键值的函数吗?IE。(0,0)

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

4

5 回答 5

1
class cell(object):
     def my_idx(self,grid):
         return grid.keys()[grid.values().index(self)]

然后调用它

some_cell.my_idx(grid)
于 2012-10-11T20:55:16.083 回答
1

这里有两个单独的问题...首先,要从单元格内访问网格,我会让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()方法返回它。

于 2012-10-11T21:10:43.137 回答
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]

请注意,如果对象在字典中不止一次,它不会给你可靠的结果,如果对象不在字典中,它会引发异常。

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

于 2012-10-11T21:08:10.237 回答
1

您的问题暗示 dict 键与其值之间存在 1:1 映射,这是不正确的。拿这个代码:

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

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

两次存储数据不一定是糟糕的编程风格,但您的内存可能会受到限制。如果您cell需要知道它的索引,它必须具有该数据。如果您将单元格视为项目列表,则 dict 将成为更快访问的索引。拥有更快访问的索引当然不是不好的编程风格。;-)

于 2012-10-11T21:09:41.590 回答
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的 s 还需要知道和/或做什么,但如果你只是在这里做数字的东西,我强烈推荐scipy.sparse模块。

于 2012-10-11T21:10:00.170 回答