如何索引嵌套列表?

时间:2015-12-15 14:56:38

标签: python indexing nested

当在类中遇到嵌套列表时(更具体地说,我应该将其称为多变量函数),我可以将__getitem__方法与两个或多个参数一起使用吗?

我知道这不是__getitem__的典型用法,我应该把它写成课程的方法,但我真的想利用它的[]功能。

2 个答案:

答案 0 :(得分:1)

它根本不是非典型的; numpy一直都这么做。 __getitem__接受一个论点;它可以是一个元组。你只需要自己解析元组。

class Indexer(object):
    def __init__(self, *args, **kwargs): 
        pass
    def __getitem__(self, item):
        if isinstance(item, tuple):
            # do special processing for tuples here
            print(item)
        # Everyone likes the number 3, so make sure to return an extra 3.
        return [item, 3]
i = Indexer()

# this will print (2, 3), and got_item will have the value [(2, 3), 3]
got_item = i[2,3]

# This will print [(2, 3), 3]
print(got_item)

显然没有真正的理由返回[item, 3],但它只是证明__getitem__内的代码可以做任何想做的事情。你可以回报任何你想要的东西。

每当Python解释器看到你索引某些内容时(如代码示例中的i[2, 3]),它所做的第一件事就是用方括号之间的东西构建一个元组。您可以使用dis模块来检查这一点,该模块反汇编python代码以查看解释器的实际操作:

import dis
dis.dis('a[b, c]')

  1           0 LOAD_NAME                0 (a)
              3 LOAD_NAME                1 (b)
              6 LOAD_NAME                2 (c)
              9 BUILD_TUPLE              2
             12 BINARY_SUBSCR
             13 RETURN_VALUE

如果您以前从未见过来自dis的输出,那可能会有点混乱。重要的部分是BUILD_TUPLE 之前所说的BINARY_SUBSCR

这可能是一个太多的信息:重要的是你可以用__getitem__做任何你想做的事。

答案 1 :(得分:0)

__getitem__接受尽可能多的参数,因为它们被打包为元组。请参阅以下示例,其中中的嵌套列表存储在_data中,并使用某些维度进行初始化。

class Table(object):
    def __init__(self, dimx, dimy, initialize=0):
        self._dimx = dimx
        self._dimy = dimy
        self._data = [[initialize] * self._dimx] * self._dimy

    def __getitem__(self, *args):
        idx = args[0]
        return self._data[idx[0]][idx[1]]

    def __setitem__(self, *args):
        idx = args[0]
        self._data[idx[0]][idx[1]] = args[1]

使用此课程,您只需执行以下操作:

t = Table(10, 1)
t[0, 1] = 'a'
print(t[0, 0])
print(t[0, 1])

......它会产生:

0
a