实现对象的递归切片的最佳方式,例如用于合并排序

时间:2014-10-19 16:10:10

标签: python sorting recursion parameter-passing slice

我想在数组对象上实现一个切片,其中对象负责切片而不会丢失其属性。我最初的实施:

class Array(list):
    @property        #example
    def length(self):
        return len(self)

def foo(array_obj)
   # some type of merge-sort algorithm
   length = array_obj.length
   A = foo(array_obj[:(length//2)]) #pass the 1st half of the array_obj to foo()
   B = foo(array_obj[(length//2):]) #pass the 2nd half of the array_obj to foo()

def main():
... #create an array from numbers in a file
array_a = Array([number for number in map(int, [line.strip() for line in fh])])
foo(array_a)

内部foo最终获取列表而不是切片的array_obj实例。 (python syntax 3.x)所以,array_obj.length,报告:AttributeError:' list'对象没有属性' length'。

我正在考虑使用递归排序算法,就地排序可能会更有效,更快。其他情况可能会享受深层复制。关于解决这个问题的最佳方法的见解和建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

您要做的是覆盖__getitem__魔术方法。在这种情况下,请执行以下操作:

class Array(list):
    @property        #example
    def length(self):
        return len(self)

    def __getitem__(self, index):
        if isinstance(index, slice):
            return Array(super().__getitem__(index))
        return super().__getitem__(index)