如何在Python中定义二维列表?

时间:2014-01-13 06:13:47

标签: python

根据我的理解,Python中的二维列表只是一个列表列表,因此二维列表可以定义如下:

a=[[0,0],[1,1]]

要获取此二维列表的元素,我们必须编写

a[0][1]

以下表格

a[0,1]

会导致错误。也就是说,索引应该用[]分隔,而不是用逗号分隔的一个[]

然而,在“Python基本参考”一书的第59页,第四版,David M. Beazley,我读到:

enter image description here

在上图中,我们可以看到多维列表可以以m[1:10, 3:20]的形式编写。但是如何在Python中定义这样一个二维列表,以便我们可以使用m[1,2]形式获取元素?感谢。

3 个答案:

答案 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))