4

私はリストを埋め込んだクラスに取り組んでいます。

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]

パラメータが単一のインデックスでない場合、 はオブジェクトを__delitem__受け取ります。オブジェクトを使用して、指定された要素を反復処理するsliceにはどうすればよいですか?slice

4

2 に答える 2

4

スライス オブジェクトのindicesメソッドは、シーケンスの長さが与えられると、フィードできるスライスの標準的な解釈を提供します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)

を使用すると、 Dunesslice.indicesによって指摘された場合に正しい動作が得られます。また、スライス オブジェクトを に渡すことができることにも注意してください。そのため、前処理を行い、実際の削除を基になるリストに委譲するだけでよい場合は、実際には「ナイーブ」が正しく機能します。list.__delitem__del self.l[i]

operator.index__delitem__インデックスに変換できないスライス以外のオブジェクトを受け取った場合、早期の例外が確実に発生するようにします。

于 2012-10-20T08:11:24.397 に答える
3

sliceオブジェクトには、、、startおよびstop属性stepがあり、これらの各コンポーネントを取得するために使用できます。例えば:

def __delitem__(self, i):
    if isinstance(i, slice):
        for j in xrange(i.start, i.stop, i.step):
            print j
    else:
        print i
于 2012-10-20T07:48:27.010 に答える