我希望能够在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}}
答案 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
成功,您可能需要检查other
和zip
的长度是否相同。