繁体   English   中英

Python:列表列表__getitem__

Python: list of list __getitem__

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我已经为连接4游戏创建了一个Board类,它使用了一个列表列表。 我想让对象支持索引板的行和列:

class Test:
    def __init__(self, cols, rows):
        self.cols = cols
        self.rows = rows
        self.data = [[' '] * cols for row in range(rows)]

    def __iter__(self):
        yield from self.data

    def __getitem__(self, row):
        pass
        # what should this be?

我知道我需要定义__getitem__但是这个方法应该允许什么语法如b[1][1] 我已经看了一些过去的问题,但我似乎无法找到我正在寻找的答案。

编辑 :也许以下是正确的做事方式?

def __getitem__(self, row):
    return self.data[row]
3 个回复

你需要理解的基本事情是,对于像b[1][2]这样的语法,有两个 __getitem__调用。 首先,调用b.__getitem__(1) ,并返回一个对象。 然后,调用returned_object.__getitem__(2) 因此,无论什么类别b都不能完全控制整个过程。

在上面的示例中,如果您将其定义为

def __getitem__(self, row):
    return self.data[row]

然后b[1][2]将首先调用b.__getitem__(1) ,这将返回self.data[1] ,这将是一个列表。 该列表也支持__getitem__ ,因此将调用下一个list.__getitem__(2)

如果你想控制这两个 ,那么你需要定义另一个表示列的类,父类需要返回其中一个对象而不是原始列表,然后那个可以为自定义功能实现自己的__getitem__

其他选择是支持b[1,2]这样合法的语法 - 它会将(1,2)作为元组调用b.__getitem__((1,2)) (你可以把任何东西放在那里),但是它不那么自然。

您可以返回子列表所代表的row

def __getitem__(self, row):
    return self.data[row]

例如

>>> t = Test(2,5)
>>> t.data
[[' ', ' '],
 [' ', ' '],
 [' ', ' '],
 [' ', ' '],
 [' ', ' ']]

排好队

>>> t[1]
[' ', ' ']

得到一个元素

>>> t[1][0]
' '

请注意,上面示例中的第二个操作[0]不需要您定义它,因为它只是从list调用__getitem__ ,因为它就是这样。

只需返回行:

def __getitem__(self, row):
    return self.data[row]
1 使用python中的__getitem__作为列表的打印类

我有一个应该充当差异列表的类,该差异列表是从另一个列表计算得出的。 例如,如果我有一个位置列表,则可以使用我的类来动态创建位移列表。 为此,我通过以下方式使用了__getitem__方法: 如果我打印单个元素,效果很好,但是如果我打印整个列表,它会给我: 我想知道我还必须 ...

3 __getitem__在列表列表上有切片

我正在创建一个代表列表列表的类。 __getitem__使我头疼。 一切都进行得很顺利,直到我引入slice作为参数为止。 示范代码 输出如下 显然,正在发生的事情是第二个[]运算符调用被应用到第一个[...]运算符的调用,但仍停留在最外层列表的上下文中。 解决方案使 ...

4 __getitem__表示列表与词典

Dictionary __getitem__方法似乎与List的工作方式不同,这让我感到头疼。 这就是我的意思: 如果我是子类列表 ,我可以将__getitem__重载为: 但是,如果我将dict子类化,则__getitem__不会公开索引 ,而是键入,如: 那么,我的问 ...

5 修改 __getitem__ 后无法对列表进行切片

对于特定用例,我想定义一个列表类,如果索引为负数或超出范围,则返回 0。 我目前的方法已经服务于特定目的: 但不幸的是,它在切片列表时会导致一些不良行为: 有没有办法解决这个问题? ...

2020-02-20 00:19:44 2 62   python
7 在 python 上覆盖 __getitem__

我想覆盖类上的__getitem__方法。 我知道有类似的问题,但我想更准确和清楚。 我如何使这项工作: class A: def __init__(self, l: list): self.l = l def __getitem__(self, i: int): return se ...

9 Python __getitem__错误

我有一个快速的问题,这行代码 给我错误: 经过一些研究,我发现当您尝试在一个int上调用一个列表号时,会发生此错误。 在这种情况下,我要发送3个数字的列表,然后想递归(我们不允许在第二个数字列表上使用循环:(),看看第二个列表中的任何元素是否在第一个列表中如果是,则将完成某些操 ...

2014-03-06 20:43:05 5 82   python
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM