所以我正在设计一个需要索引嵌套列表的程序,使用存储的坐标列表:
例如
coordinate = [2,1]
对于返回嵌套列表中元素的函数,我使用
return room[coordinate[0]][coordinate[1]]
我的编程直觉告诉我,这似乎太长了,应该有更短的方法来做这件事,尤其是在 Python 中,但我似乎找不到任何类似的东西。有谁知道是否有这样的方法?
所以我正在设计一个需要索引嵌套列表的程序,使用存储的坐标列表:
例如
coordinate = [2,1]
对于返回嵌套列表中元素的函数,我使用
return room[coordinate[0]][coordinate[1]]
我的编程直觉告诉我,这似乎太长了,应该有更短的方法来做这件事,尤其是在 Python 中,但我似乎找不到任何类似的东西。有谁知道是否有这样的方法?
该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]])
您可以将坐标解压缩到多个变量中。
i, j = [2, 1]
return room[i][j]
或者
coordinates = [2, 1]
### do stuff with coordinates
i, j = coordinates
return room[i][j]
coordinates[2][1] = "blah"
是如何正确索引到嵌套列表
使用元组可能是存储静态、不可变坐标的好方法
myCoord = (2,1)
您对嵌套room
数组进行索引的方式看起来是正确的,并且是一个可读的选项。我必须更多地了解您如何使用它来就使用哪些数据类型提出建议。
编辑
作为对您的评论的回应,我会说这是否是一个函数,接受x
并y
作为输入,或者如果这是不可能的,x,y = myTuple
那么您可以这样做:
room[x][y]
代替
room[coords[0]][coords[1]]
这将使它更具可读性,因为这似乎是您关心的问题。没有办法使用元组对嵌套列表进行本地索引
您可以定义自己的递归索引函数:
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
一个简单的解决方案是使用 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
潜在的问题是您使用列表作为您想要以非列表方式访问的信息的数据结构。
列表本身很好,您可能最终希望使其成为一个对象,该对象具有列表作为其存储空间,但为用户提供了一个更加面向任务的界面。
如果你还没有准备好上课,这会让你更接近不要重复自己:
def room_at_coordinate(rooms, coordinate)
return rooms[coordinate[0]][coordinate[1]]
>>> room_at_coordinate(rooms, coordinate)
'bathroom'
如果您决定走那条路线,此功能将自然地滑入对象中。