【问题标题】:python: array default value for index out-of-boundspython:索引超出范围的数组默认值
【发布时间】:2011-05-23 17:58:33
【问题描述】:

我需要一个好方法来请求数组/矩阵值,但报告超出范围索引的默认 (0) 值:
如果第二个索引长度为 3,则 b[2][4] 应返回 0,并且
b[-1][2] 也
我检查了这个: Getting a default value on index out of range in Python,但在我看来,它不适用于负索引 - 因为 python 总是将数组长度添加到它们(真的?)
我一直在考虑重载__getitem__,但我1个月前才来python,我不是那么熟练...

任何帮助表示赞赏!

亚历山德罗

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    对于一般知识,getitemsetitem的用法是这样的:

    (内部对象类)

    def __getitem__(self,index):
        print index
        return self.mylist[index]
    
    def __setitem__(self,index,value):
        self.mylist[index]=value
    

    如果你重写了列表类(class newListClass(list):),并且想在你自己的getitem中使用list的getitem,你需要写:

    class newListClass(list):
        def __getitem__(self,index):
            return list.__getitem__(self,index)
    

    这样你也可以从这个getitem中捕获异常并返回你想要的。 这不是您问题的答案,Martin 的答案是……但您对 getitem 的用法感兴趣,所以这就是解决问题的方法。 享受:)

    【讨论】:

      【解决方案2】:

      因为 python 总是将数组长度添加到它们(是吗?)

      内置的 Python 序列可以做到这一点,但据我所知,这是由这些序列的实现完成的,而不是由 Python 编译器完成的。所以不,你会在__getitem__(或__getslice__)中收到负值,并且可以根据需要处理它们。

      【讨论】:

        【解决方案3】:

        如果你想要一个无限大的稀疏矩阵,你可以使用defautldict:

        py> matrix=defaultdict(lambda:defaultdict(lambda:0))
        py> matrix[2][4]
        0
        py> matrix[2][4]=8
        py> matrix[2][4]
        8
        py> matrix[-1][2]
        0
        

        【讨论】:

        • +1 表示稀疏“数组”== dict。我喜欢使用带有元组作为键的单个字典(而不是嵌套),例如matrix[2, 4].
        • @Ben:我同意,元组在二维数组中制作更好的索引。但是,将索引分开是 OP 问题中的一项要求。
        • — 哦,我并没有挑剔你的回答,这似乎是提出建议的自然场所。 :-)
        • 你也可以这样做defaultdict(lambda: defaultdict(int)) - int() is 0
        • @Ben Blank - 我不知道这是有效的 Python 语法...谢谢 :)
        【解决方案4】:

        我认为您的问题令人困惑。

        listy[-1] 是一个 相对 索引,因此真正的索引等于 len(listy),

        listy[-2] true index 是 len(listy) -1, ... 以此类推

        如果相对索引不存在,它仍然会引发IndexError。比如这个:[][0]或者这个[1][-2]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 2016-04-04
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多