如何在Python中进行二维(x,y)索引?

如何在Python中进行二维(x,y)索引?,python,multidimensional-array,indexing,Python,Multidimensional Array,Indexing,通常,如果您有一个二维数据结构,它是两个容器的组合—列表列表或字典字典。如果你想制作一个单一的集合,但要在两个维度上工作,该怎么办 而不是: collection[y][x] 做: 我知道这是可能的,因为返回一个这样工作的对象。关键是要理解Python是如何进行索引的——当您尝试使用方括号对对象进行索引时,它调用对象的\uuuuu getitem\uuuuu方法。感谢这个答案为我指明了正确的方向: 使用方括号中的一对索引时,将使用键参数的元组调用\uuu getitem\uuuu方法 这里有一

通常,如果您有一个二维数据结构,它是两个容器的组合—列表列表或字典字典。如果你想制作一个单一的集合,但要在两个维度上工作,该怎么办

而不是:

collection[y][x]
做:


我知道这是可能的,因为返回一个这样工作的对象。

关键是要理解Python是如何进行索引的——当您尝试使用方括号对对象进行索引时,它调用对象的
\uuuuu getitem\uuuuu
方法。感谢这个答案为我指明了正确的方向:

使用方括号中的一对索引时,将使用
参数的元组调用
\uuu getitem\uuuu
方法

这里有一个简单的演示类,当给定一个二维索引时,它将一个整数索引返回到一维列表中

class xy(object):

    def __init__(self, width):
        self._width = width

    def __getitem__(self, key):
        return key[1] * self._width + key[0]

>>> test = xy(100)
>>> test[1, 2]
201
>>> test[22, 33]
3322
还有一个附带的
\uuuuu setitem\uuuuu
方法,在分配给方括号中的索引时使用。

使用数组

如果您有一个普通的Python数组,可以将其转换为numpy数组并访问其元素,如您所述:

a = [[1,2,3],[4,5,6],[7,8,9]]
A = numpy.array(a)
print A[1,1]
将打印:

5
另一个例子:

A = numpy.zeros((3, 3))
for i in range(3):
    for j in range(3):
        A[i,j] = i*j
print A
将为您提供:

[[ 0.  0.  0.]
 [ 0.  1.  2.]
 [ 0.  2.  4.]]
我找到了。使用它,您可以使用索引迭代器访问容器的元素。如果您需要使用
容器[index_1,index_2]
表示法,可以使用Mark的文章中概述的方法轻松地进行调整

>>> from operator import getitem
>>> from functools import reduce
>>> l = [1,[2,[3,4]]]
>>> print(reduce(getitem, [1,1,1], l))
 4
这里是python邮件列表上建议的一种不同方法,我将其改编为
container[index\u 1,index\u 2]
表示法

class FlatIndex(object):
  def __init__(self, l):
    self.l = l
  def __getitem__(self, key):
    def nested(l, indexes):
      if len(indexes) == 1:
        return l[indexes[0]]
      else:
        return nested(l[indexes[0]], indexes[1:])
    return nested(self.l, key)

>>> l = [1,[2,[3,4,[5,6]]]] 
>>> a = FlatIndex(l)
>>> print(a[1,1,2,1])
 6

我看不出这与这个问题有什么关系。我将这个问题与通过使用一组索引从容器中访问一个元素联系起来。不过,这个符号有点难看。我真的不明白你想要实现什么,但你的帖子很有洞察力。
class FlatIndex(object):
  def __init__(self, l):
    self.l = l
  def __getitem__(self, key):
    def nested(l, indexes):
      if len(indexes) == 1:
        return l[indexes[0]]
      else:
        return nested(l[indexes[0]], indexes[1:])
    return nested(self.l, key)

>>> l = [1,[2,[3,4,[5,6]]]] 
>>> a = FlatIndex(l)
>>> print(a[1,1,2,1])
 6