根据我的理解,Python中的二维列表只是一个列表列表,因此二维列表可以定义如下:
a=[[0,0],[1,1]]
要获取此二维列表的元素,我们必须编写
a[0][1]
以下表格
a[0,1]
会导致错误。也就是说,索引应该用[]
分隔,而不是用逗号分隔的一个[]
。
然而,在“Python基本参考”一书的第59页,第四版,David M. Beazley,我读到:
在上图中,我们可以看到多维列表可以以m[1:10, 3:20]
的形式编写。但是如何在Python中定义这样一个二维列表,以便我们可以使用m[1,2]
形式获取元素?感谢。
答案 0 :(得分:3)
尽管Python列表没有多个维度,但是numpy
附带的数组/矩阵需要带有两个或更多索引/切片的表示法。尽管它(故意)不属于核心库,但它已成为n维数组的事实标准。
您可以在此输入
>>> import numpy as np
>>> ar = np.array([[1,2],[3,4]])
>>> ar[0,0]
1
>>> ar[:,0]
array([1, 3])
>>> random_array = np.random.random((100,100))
>>> random_array[50:60,30:35]
array([[ 0.8352567 , 0.14901839, 0.2409099 , 0.88278442, 0.84300552],
[ 0.88403713, 0.54964811, 0.83500869, 0.88258427, 0.90273584],
[ 0.00271817, 0.94116153, 0.6282039 , 0.3243262 , 0.71785796],
[ 0.0661821 , 0.99243509, 0.5888741 , 0.04161134, 0.89517395],
[ 0.87419943, 0.14761041, 0.06123542, 0.8139316 , 0.66220133],
[ 0.24710625, 0.02305463, 0.7301232 , 0.11279152, 0.57674316],
[ 0.9893136 , 0.9711931 , 0.12936097, 0.49021876, 0.24834283],
[ 0.48277394, 0.76470469, 0.29348414, 0.43578663, 0.69670601],
[ 0.43401812, 0.14714134, 0.52015761, 0.40088974, 0.25203087],
[ 0.9431969 , 0.04824567, 0.98400652, 0.1129802 , 0.25518842]])
自定义类似乎是一个非常特殊的用例 - numpy数组真的使用了很多,几乎没有科学的Python库不使用numpy。
答案 1 :(得分:2)
像这样的类处理它:
class List(list):
def __getitem__(self, index):
if type(index) is int:
return super(List, self).__getitem__(index)
l = self
for i in index:
if not isinstance(l, list)
raise IndexError('Too many indexes: out of depth.')
l = l[i]
return l
你可以像这样使用它:
>>> l = List([[1,2,3],[3,2,1]])
>>> print l[1,2]
答案 2 :(得分:2)
也就是说,索引应该用
[]
分隔,而不是用逗号隔开一个[]
。
a[0,1]
相当于a[(0, 1)]
,后者调用a.__getitem__((0, 1))
。
a[0][1]
相当于a.__getitem__(0).__getitem__(1)
。如您所见,括号实际上只是调用__getitem__
的一种很好的方式。
Python仅列出支持整数和slice
对象作为__getitem__
的参数,因此您无法编写a[0, 1]
。但是,您可以编写自己的类,并__getitem__
执行任何操作:
>>> class Something(object):
... def __getitem__(self, arg):
... return arg
...
>>> Something()[{1, 2, 3}, {4, 5, 6}, 'foo', ..., 12, 4:2]
({1, 2, 3}, {4, 5, 6}, 'foo', Ellipsis, 12, slice(4, 2, None))