Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现delitem来处理所有可能的切片场景?_Python_Slice - Fatal编程技术网

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我添加了一个答案,以一种相当优雅的方式涵盖了这些案例。