更多pythonic方法使用坐标列表进行索引

时间:2013-08-15 16:26:11

标签: python list coordinates

所以我正在设计一个需要使用存储的坐标列表索引嵌套列表的程序:

e.g

coordinate = [2,1]

对于返回嵌套列表中元素的函数,我使用

return room[coordinate[0]][coordinate[1]]

我的编程直觉告诉我,这似乎过长了,应该有一个更短的方法,特别是在Python中这样做,但我似乎无法找到任何类型的东西。有谁知道是否有这样的方法?

6 个答案:

答案 0 :(得分:1)

numpy模块具有方便的索引。如果您的room非常大,那么效果会很好。

>>> import numpy as np
>>> room = np.arange(12).reshape(3,4)
>>> room
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> coords = (2, 1) # it's important this is a tuple
>>> room[coords]
9

要将room变量转换为numpy数组,假设它是一个二维嵌套列表,只需执行

>>> room = [[0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4],
            [0, 1, 2, 3, 4]]
>>> room = np.array(room)
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

答案 1 :(得分:1)

您可以将坐标解压缩为多个变量。

i, j = [2, 1]
return room[i][j]

coordinates = [2, 1]
### do stuff with coordinates
i, j = coordinates
return room[i][j]

答案 2 :(得分:0)

coordinates[2][1] = "blah"

是你如何正确索引到嵌套列表

使用元组可能是存储静态不可变坐标的好方法

myCoord = (2,1)

您对嵌套room数组进行索引的方式看起来是正确的,并且是一个可读的选项。我必须更多地了解您如何使用它来推荐使用哪种数据类型。

修改
在回复您的评论时,我会说这是一个功能,接受xy作为输入,或者如果不可能,请x,y = myTuple
这样你就可以这样做:

room[x][y]

而不是

room[coords[0]][coords[1]]

这将使它更具可读性,因为这似乎是你的关注点。没有办法使用元组

本地索引嵌套列表

答案 3 :(得分:0)

您可以定义自己的递归索引函数:

def rec(x, i):
    if i: return rec(x[i[0]], i[1:])
    else: return x

给出了:

>>> room = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]]
>>> rec(room, (2,1))
[16, 17, 18]
>>> rec(room, [2,1,1])
17

答案 4 :(得分:0)

一个简单的解决方案是使用NumPy:

In [1]: import numpy

In [2]: a = numpy.arange(15).reshape(3, 5)

In [3]: a
Out[3]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

In [4]: coords = (2, 1)

In [5]: a[coords]
Out[5]: 11

如果这不是一个选项,你可以将list子类化为实现这种索引:

class MyList(list):
    def __getitem__(self, index):
        if isinstance(index, collections.Iterable):
            return reduce(operator.getitem, index, self)
        return list.__getitem__(self, index)

使用示例:

>>> a = MyList([[ 0,  1,  2,  3,  4],
                [ 5,  6,  7,  8,  9],
                [10, 11, 12, 13, 14]])
>>> coords = (2, 1)
>>> a[coords]
11

答案 5 :(得分:0)

根本问题在于您使用列表作为要以非列表方式访问的信息的数据结构。

列表本身没问题,你最终可能希望将它作为一个列表作为其存储,但为用户提供了一个面向任务的界面。

如果你还没准备好上课,这会让你更接近于不要重复自己:

def room_at_coordinate(rooms, coordinate)
    return rooms[coordinate[0]][coordinate[1]]

>>> room_at_coordinate(rooms, coordinate)
'bathroom'

如果你决定走这条路,这个功能会自然地滑入一个物体。