继承列表:通过其他列表,整数和浮点数创建除法

时间:2016-07-22 18:50:44

标签: python list

我希望能够在Python中按整数,浮点数和其他相等长度的列表划分整个列表,所以我编写了以下小脚本。

self.__cont_

我的问题:我怎样才能以更简单的方式写这个?我真的需要行self.__len_>>> X = divlist([1,2,3,4]) [1, 2, 3, 4] >>> X // 2 [0, 1, 1, 2] >>> X // [1,2,3,4] [1, 1, 1, 1] >>> X // X [1, 1, 1, 1] 吗?我正在查看列表的“魔术”方法,但我找不到一个能够随时掌握这些信息的方法。

调用这个简单类的一个例子:

{{1}}

2 个答案:

答案 0 :(得分:5)

  
    

我怎样才能以更简单的方式写这个?

  

使用self[i]代替self.__cont_[i]

  

我真的需要行自我.__ cont_和self .__ len _?

没有。只需使用引用列表的常规方法,例如:[]len()

另外,您可以选择让.__floordiv__()返回divlist而不是list,以便继续操作结果。

class divlist(list):
    def __floordiv__(self, other):
        """ Adds the ability to floor divide list's indices """
        if (isinstance(other, int) or isinstance(other, float)):
            return [i // other for i in self]
        elif (isinstance(other, list)):
            # DANGER: data loss if len(other) != len(self) !!
            return [i // j for i,j in zip(self, other)]
        else:
            raise ValueError('Must divide by list, int or float')

X = divlist([1,2,3,4])
assert X == [1, 2, 3, 4]
assert X // 2 == [0, 1, 1, 2]
assert X // [1,2,3,4] == [1, 1, 1, 1]
assert X // X == [1, 1, 1, 1]

答案 1 :(得分:3)

不是检查每个参数的显式类型,而是假设第二个参数是可迭代的,或者它是一个合适的值作为//的分母。

def __floordiv__(self, other):
    try:
        pairs = zip(self, other)
    except TypeError:
        pairs = ((x, other) for x in self)
    return [x // y for (x, y) in pairs]

如果self成功,您可能需要检查otherzip的长度是否相同。