在字典中存储类似矩阵的数据

时间:2014-01-21 16:52:19

标签: python dictionary matrix

我有一个嵌套在另一个循环中的循环:

position={}
n=2
for i in range(n):
i=str(i)
    for j in range(n):
        j=str(j)
        position[str(i+j)]= #whatever (in my case an object)

这样字典的关键值就是矩阵中的索引,我只需要调用position['11']来获取它。
是否有更好的方式加入ij?并存储(并创建)类似矩阵的数据?

PS:我知道numpy库,但我还没有成功安装它......但这是另一个问题......

3 个答案:

答案 0 :(得分:2)

你的词典令人头疼,等待发生。它无法区分第1行,第11列和第11行第1列。

如果你无法让NumPy工作,你问题的标准解决方案是嵌套列表:

matrix = [[whatever() for i in xrange(n)] for j in xrange(n)]

您可以使用matrix[i][j]将其编入索引。

您还可以使用以元组索引的字典:

matrix = {(i, j): whatever() for i in xrange(n) for j in xrange(n)}

并使用matrix[i, j]对其进行索引。这可能会让需要维护代码的人感到惊讶。

答案 1 :(得分:1)

如果您不想使用numpy,可以使用嵌套列表(相当于C中的多维数组):

position=[]
n=2
for i in range(n):
    position.append([])
    for j in range(n):
        position[i].append(some_object)

然后使用position[i][j]引用它。

另一种方法是使用平面列表并使用计算值对其进行索引(基本上当您在C等中索引到2D数组时会发生什么,因为它们存储为一个连续数组并且编译器执行一些你提供的索引到底层平面数组的多个索引的数学运算:

position=[]
n, m = 2, 3
for i in range(n):
    for j in range(m):
        position.append(some_object)

# do something with the object at (i, j)
position[m*i + j].do_something() # there are m elements between (i, j) and (i+1, j)

答案 2 :(得分:1)

"对"答案是弄清楚如何安装Numpy,因为这将比编写自己开发的伪矩阵类更多地改进您的编程工具集。

但是,如果你想按自己的方式去做,这会导致问题:

position[str(i+j)]

您如何区分2,1121,1

所以你的dict键需要像

position["{},{}".format(i,j)]

或者@ user2.3M暗示:

position[(i,j)]

但是你真的不想为每个"矩阵"构建复杂的字符串或新元组。访问。
除非地图非常大且稀疏,否则在@ JAB的答案中使用其中一个基于列表的版本要好得多。