Python 如何实现delitem来处理所有可能的切片场景?
我工作在一个包含和嵌入列表的类上Python 如何实现delitem来处理所有可能的切片场景?,python,slice,Python,Slice,我工作在一个包含和嵌入列表的类上 class a: def __init__(self, n): self.l = [1] * n def __getitem__(self, i): return self.l[i] def __delitem__(self, i): print type(i) print i 我想将del运算符与片的完整语法一起使用: p = a(10) del p[1:5:2] 如果
class a:
def __init__(self, n):
self.l = [1] * n
def __getitem__(self, i):
return self.l[i]
def __delitem__(self, i):
print type(i)
print i
我想将del
运算符与片的完整语法一起使用:
p = a(10)
del p[1:5:2]
如果参数不是单个索引,则
\uu delitem\uu
将接收切片
对象。如何使用切片
对象来迭代指定的元素?切片
对象具有开始
、停止
和步骤
属性,您可以使用这些属性来获取每个组件。例如:
def __delitem__(self, i):
if isinstance(i, slice):
for j in xrange(i.start, i.stop, i.step):
print j
else:
print i
给定序列的长度,切片对象的
索引
方法将提供切片的规范解释,您可以将其馈送到xrange
:
def __delitem__(self, item):
if isinstance(item, slice):
for i in xrange(*item.indices(len(self.l))):
print i
else:
print operator.index(item)
使用slice.index
可以确保在所指出的情况下获得正确的行为。还请注意,您可以将切片对象传递给列表。因此,如果您只需要执行一些预处理并将实际删除委托给基础列表,那么“naive”del self.l[i]
实际上可以正常工作
operator.index
将确保如果您的\uuu delitem\uuuu
接收到无法转换为索引的非切片对象,您会得到早期异常。需要指出的是,如果切片不完整(即,它有隐含部分)切片对象的相应属性将为None
。如果stop>len(self)
,这将产生错误的索引。它也不适用于某些负索引/步骤的组合。例如slice(-10,5,-1)
如果len(p)>11
@jpm是的,这就是我遇到的。然而,这个答案给了我们继续前进的暗示。@Dunes我添加了一个答案,以一种相当优雅的方式涵盖了这些案例。