首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中自动增长2D列表?

在python中自动增长2D列表?
EN

Stack Overflow用户
提问于 2014-03-16 19:49:11
回答 2查看 333关注 0票数 0

在阅读了Automatically growing lists in Python之后,我现在正在尝试创建一个自动增长的二维列表。基本上我会说

代码语言:javascript
复制
>>> l = 2DGrowingList(' ') # Fills the inner lists with space (' ') character
>>> l[1][2] = 'x'
>>> print(l)
[[], [' ', ' ', 'x']]
>>> l[0][1] = 'a'
>>> print(l)
[[' ', 'a'], [' ', ' ', 'x']]

我尝试的是这样的:

代码语言:javascript
复制
class GrowingList(list):

    def __init__(self, fill):
        super().__init__()
        self.fill = fill

    def __setitem__(self, index, value):
        if index > len(self) - 1:
            self.extend([self.fill] * (index + 1 - len(self)))
        list.__setitem__(self, index, value)

现在我尝试创建一个新的2D列表,如下所示:

代码语言:javascript
复制
l = GrowingList(GrowingList(' '))

但它并不像预期的那样工作,因为它使用相同的实例来填充列表:

代码语言:javascript
复制
>>> l[3][0] = 'x'
>>> print(l)
[[], [], [], ['x']]
>>> l[1][0] = 'y'
>>> print(l)
[['y'], ['y'], ['y'], 'x']

此外,它不允许我立即使用l[0][2] = ...,但我必须首先调用l[0],然后才能访问l[0][2]

EN

回答 2

Stack Overflow用户

发布于 2014-03-16 20:55:24

可以通过将您的类更改为使用工厂函数而不是填充值来解决此问题。但是如果你想直接做2D索引,而不是直接在外部列表中设置任何东西,那么除了__setitem__之外,你还需要让__getitem__扩展列表。这是因为l[x][y]尝试先获取l[x],然后再在其中设置y索引。

一种更好的方法可能是使用一个键为row, column元组的字典。您可以使用dict.get来检查值,并获得缺失键的默认值。

代码语言:javascript
复制
l = {}
l[3, 5] = "x"
l[0, 0] = "y"
l[9, 9] = "z"
for i in range(10):
    print("".join(l.get((i, j), ".") for j in range(10))) # "." is default value

这将打印:

代码语言:javascript
复制
y.........
..........
..........
.....x....
..........
..........
..........
..........
..........
.........z
票数 0
EN

Stack Overflow用户

发布于 2014-03-16 21:28:00

对于您的问题,最简单的解决方案可能是使用可调用的tu构建填充值,以便在矩阵中具有不同的实例。

代码语言:javascript
复制
    class GrowingList(list):

    def __init__(self, fill):
        super().__init__()
        self.fill = fill

    def __setitem__(self, index, value):
        if index > len(self) - 1:
            self.extend(self.fill() for i in range(index + 1 - len(self)))
        list.__setitem__(self, index, value)

注意,fill现在是一个可调用的,所以你需要将它包装在一个函数中:

代码语言:javascript
复制
l = GrowingList(lambda: GrowingList(lambda: ' '))

您也不能依赖项乘法,因为它只是将值重复n次。为了避免这种情况,使用了列表理解。

然而,这种方法仍然存在一个问题:

代码语言:javascript
复制
l = GrowingList(lambda: GrowingList(lambda: ' '))
l[1][3] = 1

IndexError: list index out of range

你可能想要考虑使用一个字典作为一个离散矩阵,如Blckknght所建议的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22436447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档